Skip to content

算术运算

所有方法都返回新的 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

相关章节