温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Double双精度为啥不等于0

发布时间:2026-09-15 02:57:13 来源:亿速云 阅读:84 作者:小樊 栏目:编程语言

在 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...

三、为什么“不等于 0”

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

四、正确的比较方式(重点)

✅ 用“误差范围(epsilon)”比较

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,是因为浮点数只能“近似”表示实数,计算误差是不可避免的。

如果你愿意,我也可以:

  • 画一张 IEEE 754 内存结构图
  • 或结合你具体业务场景(金额 / 物理计算 / 游戏)给方案
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI