在 Java 里,double(双精度浮点数)不要直接用 == 判断相等,原因是浮点数存在精度误差。下面给你几种常见、正确的做法,以及适用场景。
==double a = 0.1 + 0.2;
double b = 0.3;
System.out.println(a == b); // false
原因:
0.1 + 0.2 在二进制中无法精确表示,结果并不是数学意义上的 0.3。
Math.abs 判断误差范围double a = 0.1 + 0.2;
double b = 0.3;
double EPSILON = 1e-9;
if (Math.abs(a - b) < EPSILON) {
System.out.println("相等");
}
✅ 适用于绝大多数业务场景
EPSILON 取值建议:
1e-91e-6 或更小Double.compare(不推荐用于相等判断 ❌)Double.compare(a, b) == 0
⚠️ 本质仍然是 ==,不能解决精度问题,只适合排序或比较大小。
Double.isNaN(a)
⚠️ NaN == NaN 永远为 false
double a = Double.NaN;
System.out.println(a == a); // false
Double.isInfinite(a)
BigDecimal(金融计算 ✅✅)如果你对精度要求极高(如金额):
BigDecimal a = new BigDecimal("0.1").add(new BigDecimal("0.2"));
BigDecimal b = new BigDecimal("0.3");
if (a.compareTo(b) == 0) {
System.out.println("相等");
}
✅ 金融、金额计算强烈推荐
⚠️ 不要用 new BigDecimal(0.1)(仍然有精度问题)
| 场景 | 推荐方式 |
|---|---|
| 一般 double 比较 | Math.abs(a - b) < EPSILON |
| 排序 / 大小比较 | Double.compare(a, b) |
| 金额 / 高精度 | BigDecimal |
| NaN / 无穷 | Double.isNaN / isInfinite |
如果你愿意,我可以帮你:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。