在 Java 里用 double(双精度浮点数)时,经常会出现“看起来应该是 0,但实际不等于 0”的情况,这本质上是由浮点数的二进制表示方式决定的。
double 是二进制浮点数double 遵循 IEEE 754 标准,它是用“二进制”来近似表示十进制的。
很多十进制小数,在二进制里是无限循环小数
例如:
0.1
在二进制中其实是:
0.0001100110011001100110011...(无限循环)
而 double 只有 64 位(其中 52 位尾数),只能“截断”存储,于是就产生了误差。
double a = 0.1;
double b = 0.2;
System.out.println(a + b); // 0.30000000000000004
或者:
double result = 1.0 - 0.9 - 0.1;
System.out.println(result); // -1.1102230246251565E-16
你“以为”是 0,实际上是:
-0.000000000000000111...
double x = 0.0 / 0.0; // NaN
double y = 1.0 - 1.0;
System.out.println(y == 0.0); // 有时是 true,但不可靠
更常见的是:
double d = 0.1 + 0.2 - 0.3;
System.out.println(d == 0.0); // false
因为 d 实际是:
5.551115123125783E-17
double d = 0.1 + 0.2 - 0.3;
if (Math.abs(d) < 1e-9) {
System.out.println("可以看作 0");
}
BigDecimal(精确计算)import java.math.BigDecimal;
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b).subtract(new BigDecimal("0.3"));
System.out.println(c.compareTo(BigDecimal.ZERO) == 0); // true
⚠️ 注意:不要用 new BigDecimal(0.1),那样还是有误差。
double 会“正好等于 0”只有在以下情况才是安全的:
double x = 0.0;
double y = 1.0 - 1.0; // 通常是 0.0
但依然不建议直接 == 0 用于计算结果。
Java 的
double不等于 0,是因为浮点数只能“近似”表示实数,计算误差是不可避免的。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。