Skip to content

数学函数

decimal.js 内置了超越函数(三角函数、双曲函数、对数、指数),这在同类库(big.js、bignumber.js)中是独有的。
所有结果都按当前 precisionrounding 舍入。
内部使用 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)-Infinityln(负数)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

log10log2静态方法(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(会极慢甚至卡死)。

相关章节