比较与判断
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) === 12. 判断方法(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() // trueWARNING
isPositive(0)返回true、isNegative(0)返回false;-0的isNegative()返回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) | NaN | cmp 遇到 NaN 返回 NaN |
new Decimal(NaN).eq(NaN) | false | NaN 不等于任何值(含自身) |
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) | NaN | max/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() 等显式方法比较,不要依赖原生比较运算符。
