算术运算
所有方法都返回新的
Decimal,原值不变,可链式调用。多数方法有短别名。
方法名大写开头(或短别名小写)都返回Decimal。
1. 四则运算
| 运算 | 方法 | 别名 | 示例(new Decimal('1.5') 为基础) |
|---|---|---|---|
| 加法 | plus(n) | add(n) | .plus('2.5') → '4' |
| 减法 | minus(n) | sub(n) | .minus('0.5') → '1' |
| 乘法 | times(n) | mul(n) | .times(2) → '3' |
| 除法 | dividedBy(n) | div(n) | .div(2) → '0.75' |
| 整除 | dividedToIntegerBy(n) | divToInt(n) | .divToInt(2) → '0' |
| 取模 | modulo(n) | mod(n) | .mod(1) → '0.5' |
js
new Decimal('0.1').plus('0.2') // '0.3'
new Decimal('10').sub('0.1') // '9.9'
new Decimal(1).div(3) // '0.33333333333333333333'(20 位有效数字)除零行为(实测):
js
new Decimal(1).div(0) // 'Infinity'
new Decimal(-1).div(0) // '-Infinity'
new Decimal(0).div(0) // 'NaN'
new Decimal(1).mod(0) // 'NaN'整除与取模的符号(默认 modulo=1,同 JS %,余数符号跟随被除数):
js
new Decimal(10).divToInt(3) // '3'
new Decimal(-10).divToInt(3) // '-3'
new Decimal(-10).mod(3) // '-1'NOTE
mod 的符号规则可通过 Decimal.set({ modulo }) 改变(EUCLID 模式恒非负),详见 配置与舍入模式。
2. 幂与开方
| 运算 | 方法 | 别名 | 说明 |
|---|---|---|---|
| 幂 | toPower(n) | pow(n) | 支持非整数指数 |
| 平方根 | squareRoot() | sqrt() | 负数 → NaN |
| 立方根 | cubeRoot() | cbrt() | 支持负数(10.6 新增) |
js
new Decimal(2).pow(10) // '1024'
new Decimal(2).pow(0.5) // '1.4142135623730950488'(非整数指数)
new Decimal(2).pow(-3) // '0.125'(负指数)
new Decimal(2).sqrt() // '1.4142135623730950488'
new Decimal(27).cbrt() // '3'
new Decimal(-8).cbrt() // '-2'边界行为:
js
new Decimal(0).pow(0) // '1'
new Decimal(0).pow(-1) // 'Infinity'
new Decimal(-1).pow(0.5) // 'NaN'(负数开非整数次方)
new Decimal(-1).sqrt() // 'NaN'3. 符号变换
| 方法 | 别名 | 示例 |
|---|---|---|
absoluteValue() | abs() | new Decimal(-5).abs() → '5' |
negated() | neg() | new Decimal(5).neg() → '-5' |
js
new Decimal('-0').abs() // '0'(负零取绝对值变成正零)
new Decimal(NaN).neg() // 'NaN'4. 取整:round / floor / ceil / trunc
| 方法 | 行为 | 例:2.7 | 例:-2.7 |
|---|---|---|---|
round() | 按全局 rounding 模式取整(默认四舍五入) | 3 | -3 |
floor() | 向 -∞ | 2 | -3 |
ceil() | 向 +∞ | 3 | -2 |
trunc()(别名 truncated()) | 截断(向 0) | 2 | -2 |
js
new Decimal(2.5).round() // '3'(默认 ROUND_HALF_UP)
new Decimal(-2.5).round() // '-3'
new Decimal(2.7).floor() // '2'
new Decimal(-2.7).floor() // '-3'
new Decimal(2.1).ceil() // '3'
new Decimal(-2.1).ceil() // '-2'
new Decimal(2.9).trunc() // '2'
new Decimal(-2.9).trunc() // '-2'WARNING
round() 不接受参数,只按当前全局 rounding 舍入;传入的参数会被忽略。 需要「指定小数位 + 指定舍入模式」时用 toDP(n, mode)(返回 Decimal)或 toFixed(n, mode)(返回字符串),见 格式化与输出。
5. clamp(范围钳制,10.6 新增)
clamp(min, max)(别名 clampedTo):把值限制在 [min, max] 区间内,超出则取边界。
js
new Decimal(5).clamp(1, 3) // '3'(超过上限)
new Decimal(0).clamp(1, 3) // '1'(低于下限)
new Decimal(2).clamp(1, 3) // '2'(在范围内,原样返回)
new Decimal('-2').clamp(1, 3) // '1'6. 静态(函数式)运算方法
不用构造实例,直接传值:
js
Decimal.add(1, 2) // '3' 加法
Decimal.sub(1, 2) // '-1' 减法
Decimal.mul('1.5', 2) // '3' 乘法
Decimal.div(1, 3) // '0.33333333333333333333'
Decimal.mod(10, 3) // '1' 取模
Decimal.pow(2, 10) // '1024' 幂
Decimal.sqrt('6.98372465832e+9823') // '8.3568682281821340204e+4911'
Decimal.cbrt(27) // '3'
Decimal.abs(-5) // '5'
Decimal.ceil('2.1') // '3'
Decimal.floor('2.9') // '2'
Decimal.round('2.5') // '3'
Decimal.trunc('2.9') // '2'
Decimal.clamp(5, 1, 3) // '3'7. 聚合:max / min / sum / hypot
js
Decimal.max(1, 3, 2) // '3' 最大值(可变参数)
Decimal.min('1.5', new Decimal(2), 1) // '1' 最小值
Decimal.sum(1, 2, 3, '0.5') // '6.5' 求和
Decimal.hypot(3, 4) // '5' 平方和开方(勾股定理)js
// 数组中求最大值:需要展开
const arr = [1, 3, 2];
Decimal.max(...arr) // '3'WARNING
max / min / sum 不接受数组,只接受可变参数;传数组会抛 [DecimalError] Invalid argument。用展开运算符 ... 即可。
8. 链式与混合类型
js
// 链式调用
new Decimal(2).div(3).plus(1).times(100).floor() // '166'
// number / string / Decimal / bigint 可混用
new Decimal('1.5').plus(2).times(new Decimal('3')) // '10.5'
// 别名混用等价
new Decimal(2).squareRoot().dividedBy(4).toPower(3)
.eq(new Decimal(2).sqrt().div(4).pow(3)) // true