在 Java 中,BigDecimal 不是普通的整数或浮点数,它包含 数值(unscaled value)和标度(scale)。因此“判等”要看你指的是哪一种“相等”。
equals 不等于“数值相等”BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
System.out.println(a.equals(b)); // false
原因:
1.0 的 scale = 11.00 的 scale = 2BigDecimal.equals() 同时比较值和 scalecompareTo✅ 最常用、最安全
a.compareTo(b) == 0
示例:
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
System.out.println(a.compareTo(b) == 0); // true
✅ 任意精度整数 / 小数都适用
✅ 忽略 scale 差异
equalsa.equals(b)
适用场景:
如果是 任意精度整数(无小数):
BigDecimal a = new BigDecimal("12345678901234567890");
BigDecimal b = new BigDecimal("12345678901234567890");
a.compareTo(b) == 0; // true
a.equals(b); // true(scale 相同)
✅ 整数场景下两者通常一致
✅ 但仍推荐 compareTo
signum()(少见)a.subtract(b).signum() == 0
不推荐,性能差。
| 需求 | 推荐方式 |
|---|---|
| 数值是否相等 | a.compareTo(b) == 0 ✅ |
| 值和精度完全一致 | a.equals(b) |
| 判 0 | a.signum() == 0 |
| 任意精度整数 | compareTo |
BigDecimal 判等,永远优先用
compareTo == 0,不要用equals判断数值是否相等。
如果你有「金额 / 科学计算 / 高精度整数」具体场景,我可以给你更针对性的建议。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。