应使用compareto()判断bigdecimal相等,因为==比较引用地址必然为false,equals()还校验scale导致1.0与1.00不等,而compareto()只比较数值大小,返回0即表示数学意义相等。

因为 == 比较的是对象引用地址,不是数值本身。
BigDecimal 是对象,不是基本类型
Java 中 int、long 等基本类型用 == 比较值没问题,但 BigDecimal 是引用类型。每次 new BigDecimal("0.01") 都会创建一个新对象,即使字符串内容一样,它们在内存中也是两个独立的实例——就像两本都写着“100元”的账本,本子不同,地址自然不同。
所以哪怕 orderAmount 和 payAmount 都是 new BigDecimal("0.01"),== 也一定返回 false。
equals() 也不等于“数值相等”
很多人误以为 equals() 就是安全替代,其实它同时校验两个维度:
- 数值是否相同
- 小数位数(scale)是否一致
例如:new BigDecimal("1.0").equals(new BigDecimal("1.00")) 返回 false,因为前者 scale=1,后者 scale=2。金融场景中,1.0 元和 1.00 元显然应视为相等,但 equals() 不买账。
compareTo() 才是金额比较的正确打开方式
它只关心数学意义上的大小关系,忽略 scale 差异:
- 返回 0 → 数值相等
- 返回正数 → 调用者大于参数
- 返回负数 → 调用者小于参数
对账、余额校验、价格比对等所有业务逻辑,都该用 compareTo() == 0 判断相等,而不是 == 或 equals()。











