Skip to content

比较与判断

1. 比较方法

方法别名返回语义
comparedTo(n)cmp(n)number小于 → -1,相等 → 0,大于 → 1;含 NaN → NaN
equals(n)eq(n)boolean相等
greaterThan(n)gt(n)boolean大于
greaterThanOrEqualTo(n)gte(n)boolean大于等于
lessThan(n)lt(n)boolean小于
lessThanOrEqualTo(n)lte(n)boolean小于等于
js
new Decimal(1).cmp(2)                  // -1
new Decimal(2).cmp(1)                  // 1
new Decimal(1).cmp(1)                  // 0

new Decimal('1.0').eq(1)               // true('1.0' 与 1 数值相等)
new Decimal('1e-7').eq('0.0000001')    // true(不同写法,同一数值)
new Decimal(1).lt(2)                   // true
new Decimal(1).gt(2)                   // false
new Decimal(2).gte(2)                  // true
new Decimal(2).lte(2)                  // true

与原生 Number 比较链等价:

js
x.eq(y)     // 等价于 x.cmp(y) === 0
x.lt(y)     // 等价于 x.cmp(y) === -1
x.gt(y)     // 等价于 x.cmp(y) === 1

2. 判断方法(is* 系列)

方法别名返回 true 当……
isFinite()值为有限数(非 NaN、非 ±Infinity)
isNaN()值为 NaN
isInteger()isInt()值为整数(含 '2.0',不含 '2.5'
isZero()值为 0(含 '0.000''-0'
isNegative()isNeg()值为负(-0
isPositive()isPos()值为正(+0,不含 -0
js
new Decimal(0).isZero()                // true
new Decimal('0.000').isZero()          // true
new Decimal('2.0').isInteger()         // true
new Decimal('2.5').isInteger()         // false
new Decimal(NaN).isNaN()               // true
new Decimal(Infinity).isFinite()       // false
new Decimal(NaN).isFinite()            // false

符号判断 —— 0 与 -0 的细节(实测,容易踩坑):

js
new Decimal(0).isNegative()            // false
new Decimal(0).isPositive()            // true   ← 0 被视为正
new Decimal('-0').isNegative()         // true   ← 字符串 -0 是负的
new Decimal('-0').isPositive()         // false
new Decimal(-0).isNegative()           // true   ← 数字 -0 也是负的
new Decimal(NaN).isNeg()               // false
new Decimal(Infinity).isPos()          // true

WARNING

  • isPositive(0) 返回 trueisNegative(0) 返回 false
  • -0isNegative() 返回 true(无论字符串 '-0' 还是数字 -0)。
  • NaN 既不是正也不是负:isNeg(NaN) / isPos(NaN) 均为 false

3. 符号函数 Decimal.sign

静态方法,返回 -1 / 0 / 1

js
Decimal.sign(-5)                       // -1
Decimal.sign(0)                        // 0
Decimal.sign(5)                        // 1
Decimal.sign(new Decimal('-0'))        // 0(注意:-0 的 sign 是 0)

NOTE

sign静态方法,实例上没有 x.sign()

4. NaN / Infinity 的比较语义

表达式结果说明
new Decimal(1).cmp(NaN)NaNcmp 遇到 NaN 返回 NaN
new Decimal(NaN).eq(NaN)falseNaN 不等于任何值(含自身)
new Decimal(1).lt(NaN)false与 NaN 比较一律 false
new Decimal(1).gt(Infinity)false有限数 < Infinity
new Decimal(1).cmp(Infinity)-1有限数 < Infinity
Decimal.max(1, NaN)NaNmax/min 遇到 NaN 返回 NaN

5. 比较的注意事项

  • 跨类型比较:参数可以是 number / string / bigint / Decimal(含其他构造器实例),会自动转换:
js
new Decimal('1.5').eq('1.50')          // true
new Decimal('1.5').eq(1.5)             // true

// 跨构造器运算(clone 出来的构造器实例也可以混用)
const Dec = Decimal.clone();
new Decimal(1).plus(new Dec(1))        // '2'(结果属于调用方构造器)
  • 比较不受精度影响precision 只影响计算结果的舍入,不影响已存储值的比较。'1.0''1.00' 存储时已归一化,eq 为 true。
  • 不要用 ===== 比较 Decimal 实例:它们比较的是对象引用,不是数值。两个不同实例即使数值相同也不 ===
js
new Decimal(1) === new Decimal(1)      // false!必须用 .eq()
  • 也不要直接用 < >:Decimal 没有实现 valueOf 返回 number(valueOf() 返回字符串),比较运算符会走字符串比较或类型转换,结果不可靠:
js
new Decimal(2) < new Decimal(10)       // false!字符串 '2' < '10' 按字典序

WARNING

请始终使用 .eq() / .lt() / .gt() / .cmp() 等显式方法比较,不要依赖原生比较运算符。

相关章节