在 Java 中,BigDecimal 既可以表示任意精度的整数,也可以表示任意精度的小数。比较 BigDecimal 时不能直接用 equals,否则会因为精度(scale)不同而误判。下面系统说明如何正确比较。
BigDecimal a = new BigDecimal("10.0");
BigDecimal b = new BigDecimal("10.00");
boolean eq = a.compareTo(b) == 0;
✅ compareTo 只比较数值大小,忽略精度差异
| 方法 | 是否推荐 | 说明 |
|---|---|---|
compareTo() |
✅ 强烈推荐 | 只比较数值,忽略 scale |
equals() |
❌ 不推荐 | 会同时比较 value 和 scale |
doubleValue() |
❌ 不推荐 | 有精度丢失风险 |
compareTo 用法详解BigDecimal a = new BigDecimal("12345678901234567890");
BigDecimal b = new BigDecimal("98765432109876543210");
int result = a.compareTo(b);
if (result < 0) {
// a < b
} else if (result > 0) {
// a > b
} else {
// a == b
}
boolean equal = a.compareTo(b) == 0;
✅ 这是比较 BigDecimal 数值是否相等的正确方式
equalsBigDecimal a = new BigDecimal("10.0");
BigDecimal b = new BigDecimal("10.00");
System.out.println(a.equals(b)); // false ❌
System.out.println(a.compareTo(b) == 0); // true ✅
原因:
a.equals(b) // 比较的是 value + scale
10.0 → scale = 110.00 → scale = 2虽然数值相同,但 scale 不同,equals 返回 false
如果你明确只处理整数(如金额分、ID、计数等):
BigDecimal a = new BigDecimal("100.00");
BigDecimal b = new BigDecimal("100");
boolean eq = a.stripTrailingZeros().compareTo(b.stripTrailingZeros()) == 0;
或者统一成整数:
BigDecimal a = new BigDecimal("100.00").setScale(0);
BigDecimal b = new BigDecimal("100");
boolean eq = a.compareTo(b) == 0;
MathContext(科学计算场景)BigDecimal a = new BigDecimal("1.00000000000000000001", MathContext.DECIMAL128);
BigDecimal b = new BigDecimal("1.0", MathContext.DECIMAL128);
boolean eq = a.compareTo(b) == 0;
❌ 错误方式:
a.equals(b)
a.doubleValue() == b.doubleValue()
✅ 正确方式:
a.compareTo(b) == 0
比较 BigDecimal 的“数值大小或相等性”永远使用
compareTo,永远不要用equals。
如果你有具体场景(如金额比较、数据库字段、JSON 反序列化、金额分区等),我可以给你更精确的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。