不能用equals()判断大小,因为equals()同时比较数值和精度(scale),如new bigdecimal("1.0").equals(new bigdecimal("1.00"))返回false;而compareto()只比较数值大小,忽略scale差异,返回-1/0/1表示小于/等于/大于,且能正确处理精度、符号和零值。

直接用 compareTo(),别用 equals() 或 == —— 它专为大小比较设计,能正确处理精度、符号和零值。
为什么不能用 equals() 判断大小?
BigDecimal.equals() 不仅比较数值,还比较精度(scale)。比如:new BigDecimal("1.0").equals(new BigDecimal("1.00")) 返回 false,因为 scale 分别是 1 和 2。
但它们的**数值大小完全相等**。用 equals() 判断“是否一样大”会出错。
compareTo() 的返回值含义要记牢
它返回一个 int:
- 返回 -1:调用对象 小于 参数对象(如
a.compareTo(b) ⇒ <code>a ) - 返回 0:两个数**数值相等**(忽略 scale 差异)
- 返回 1:调用对象 大于 参数对象
所以判断逻辑应写成:if (a.compareTo(b) > 0) { /* a > b */ },而不是 if (a.compareTo(b) == 1) —— 因为规范只保证正/负/零,不保证一定是 ±1。
注意构造方式带来的隐含精度问题
用 double 构造 BigDecimal(如 new BigDecimal(0.1))会产生不可预期的精度误差,因为 double 本身不精确。
这会导致 compareTo() 比较结果不符合数学直觉。
✅ 正确做法:
– 用字符串构造:new BigDecimal("0.1")
– 或用静态方法:BigDecimal.valueOf(0.1)(它内部转成字符串再构造,安全)
常见安全写法示例
判断大小关系的标准模式:
-
if (a.compareTo(b) == 0)→ 数值相等 if (a.compareTo(b) → a 小于 b-
if (a.compareTo(b) >= 0)→ a 大于等于 b - 排序时直接传入:
list.sort(BigDecimal::compareTo)
不需要手动处理 scale,compareTo() 内部已做数值归一化(如把 1.0 和 1.00 都转成相同 scale 再比)。











