Java 中的 double(双精度浮点数)之所以会出现“误差”,根本原因是:它用有限的二进制位去表示无限的十进制小数,很多十进制小数无法被精确表示为二进制浮点数。
下面分点说明。
Java 的 double 遵循 IEEE 754 标准,占用 64 位:
它本质上表示成:
± 尾数 × 2^指数
例如:
0.1
在十进制里很简单,但在二进制中是:
0.0001100110011001100110011...(无限循环)
但 double 只有 52 位尾数,必须截断,于是:
0.1 实际存的是近似值
System.out.println(0.1 + 0.2);
// 输出:0.30000000000000004
原因:
0.1 不精确0.2 也不精确“双精度”只是比 float 精度高:
但再高也是有限的,只能表示 2 的幂次组合的离散值,不能表示所有实数。
✅ 以下几乎必然有误差:
❌ 以下通常没问题:
BigDecimal(最推荐)BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 0.3
⚠️ 注意:必须用 字符串构造,不要用 new BigDecimal(0.1)
int price = 10; // 10 分
int total = price * 3;
if (Math.abs(a - b) < 1e-9) {
// 认为相等
}
double 有误差不是 Java 的 bug,而是二进制浮点数表示的固有限制。
如果你愿意,我也可以帮你:
float vs doubleBigDecimal 不是银弹免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。