在 Java 中,Double(包装类)和 double(基本类型)在判断“相等”时,情况是不一样的,而且浮点数本身还有精度问题。
double 能否相等可以,但不推荐直接 == 比较
double a = 0.1 + 0.2;
double b = 0.3;
System.out.println(a == b); // false
原因:
0.1 + 0.2 在二进制中无法精确表示,存在精度误差。
✅ 正确做法:使用误差范围(epsilon)
double a = 0.1 + 0.2;
double b = 0.3;
double eps = 1e-9;
if (Math.abs(a - b) < eps) {
System.out.println("相等");
}
Double 包装类能否相等==Double x = 0.1 + 0.2;
Double y = 0.3;
System.out.println(x == y); // false(比较的是引用)
== 对 Double 比较的是对象引用,不是值。
equalsDouble x = 0.1 + 0.2;
Double y = 0.3;
System.out.println(x.equals(y)); // false(仍有精度问题)
⚠️ 注意:
equals 只是精确比较 double 值,不会忽略浮点误差
double 再比较Double x = 0.1 + 0.2;
Double y = 0.3;
if (Math.abs(x - y) < 1e-9) {
System.out.println("相等");
}
Double.NaN == Double.NaN // false
Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY // true
✅ 判断 NaN:
Double.isNaN(x)
| 场景 | 是否推荐 |
|---|---|
double == double |
❌ 不推荐 |
Double == Double |
❌ 错误 |
Double.equals() |
⚠️ 仅精确相等 |
Math.abs(a-b) < eps |
✅ 推荐 |
Double.compare() |
✅ 安全 |
如果你愿意,我可以帮你写一个 通用的 Double 相等工具方法,或者解释 为什么 0.1 + 0.2 ≠ 0.3。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。