数学函数
decimal.js 内置了超越函数(三角函数、双曲函数、对数、指数),这在同类库(big.js、bignumber.js)中是独有的。
所有结果都按当前precision与rounding舍入。
内部使用 1025 位的 π 与 ln(10) 常量,保证高精度计算。
1. 三角函数(参数为弧度)
| 函数 | 实例方法 | 别名 | 说明 |
|---|---|---|---|
| 正弦 | sin() | sine() | — |
| 余弦 | cos() | cosine() | — |
| 正切 | tan() | tangent() | 在 π/2 附近 → ±Infinity |
js
new Decimal(1).sin() // '0.84147098480789650665'
new Decimal(1).cos() // '0.5403023058681397174'
new Decimal(1).tan() // '1.5574077246549022305'
// tan(π/2 近似值) → Infinity
new Decimal('1.57079632679489661923132169163975144209858469968755').tan()
// 'Infinity'2. 反三角函数(结果以弧度计)
| 函数 | 实例方法 | 别名 | 定义域 |
|---|---|---|---|
| 反正弦 | asin() | inverseSine() | [-1, 1],超出 → NaN |
| 反余弦 | acos() | inverseCosine() | [-1, 1],超出 → NaN |
| 反正切 | atan() | inverseTangent() | 全体实数 |
js
new Decimal(0.5).asin() // '0.52359877559829887308'(π/6)
new Decimal(0.5).acos() // '1.0471975511965977462'(π/3)
new Decimal(1).atan() // '0.78539816339744830962'(π/4)
// 超出定义域 → NaN
new Decimal(2).asin() // 'NaN'
new Decimal(-2).acos() // 'NaN'静态 Decimal.atan2(y, x)(四象限反正切,10.5 新增):
js
Decimal.atan2(1, 1) // '0.78539816339744830962'(π/4,第一象限)
Decimal.atan2(1, 0) // '1.5707963267948966192'(π/2)
Decimal.atan2(-1, -1) // '-2.3561944901923449288'(-3π/4,第三象限)3. 双曲函数
| 函数 | 实例方法 | 别名 |
|---|---|---|
| 双曲正弦 | sinh() | hyperbolicSine() |
| 双曲余弦 | cosh() | hyperbolicCosine() |
| 双曲正切 | tanh() | hyperbolicTangent() |
| 反双曲正弦 | asinh() | inverseHyperbolicSine() |
| 反双曲余弦 | acosh() | inverseHyperbolicCosine()(定义域 [1, ∞)) |
| 反双曲正切 | atanh() | inverseHyperbolicTangent()(定义域 (-1, 1)) |
js
new Decimal(1).sinh() // '1.1752011936438014569'
new Decimal(1).cosh() // '1.5430806348152437785'
new Decimal(1).tanh() // '0.76159415595576488812'
new Decimal(1).asinh() // '0.88137358701954302523'
new Decimal(2).acosh() // '1.3169578969248167086'
new Decimal(0.5).atanh() // '0.5493061443340548457'
// 超出定义域 → NaN
new Decimal(0.5).acosh() // 'NaN'
new Decimal(2).atanh() // 'NaN'NOTE
所有三角函数都有对应的静态版本:Decimal.sin(x)、Decimal.cos(x)、Decimal.tan(x)、Decimal.asin(x)、Decimal.acos(x)、Decimal.atan(x)、Decimal.sinh(x)、Decimal.cosh(x)、Decimal.tanh(x) 等,用法相同。
4. 对数与指数
| 运算 | 实例方法 | 别名 | 说明 |
|---|---|---|---|
| 自然对数 | ln() | naturalLogarithm() | ln(0) → -Infinity;ln(负数) → NaN |
| 任意底对数 | log(base?) | logarithm() | 不传底数 = ln |
| 自然指数 | exp() | naturalExponential() | e 的幂 |
js
new Decimal(1).exp() // '2.7182818284590452354'(e)
new Decimal(0).exp() // '1'
new Decimal(10).ln() // '2.302585092994045684'
new Decimal(8).log(2) // '3'(log₂8)
new Decimal(1000).log(10) // '3'(log₁₀1000)
new Decimal(0).ln() // '-Infinity'
new Decimal(-1).ln() // 'NaN'静态便捷函数(10.5 新增,比 log(10) / log(2) 更快更准):
js
Decimal.log10(1000) // '3'
Decimal.log2(8) // '3'
Decimal.ln(10) // '2.302585092994045684'
Decimal.exp(1) // '2.7182818284590452354'
Decimal.log(8, 2) // '3'WARNING
log10 和 log2 是静态方法(Decimal.log10(x)),实例上没有 .log10()。
5. 开方(补全)
平方根与立方根已在 算术运算 详述,此处仅提醒静态版本:
js
Decimal.sqrt(2) // '1.4142135623730950488'
Decimal.cbrt(27) // '3'
Decimal.sqrt('6.98372465832e+9823')
// '8.3568682281821340204e+4911'(超大指数也没问题)6. 随机数 Decimal.random
js
Decimal.random() // '0.14409305764082700067'(默认 20 位有效数字,0 ≤ x < 1)
Decimal.random(5) // '0.77762'(5 位有效数字)
Decimal.random(3) // '0.643'- 返回 [0, 1) 区间内的随机
Decimal。 Decimal.set({ crypto: true })后使用加密安全随机源(crypto.getRandomValues);环境不支持时抛[DecimalError] crypto unavailable。
7. 精度与性能
- 三角/对数函数内部按
precision + 10位中间精度迭代计算,再舍入到precision,因此精度越高耗时越长。 - 默认 20 位有效数字对绝大多数业务足够;科学计算可按需调大,但不要无脑设成 1e9(会极慢甚至卡死)。
