简短结论:会,Java 的 double(双精度浮点数)在特定情况下一定会“丢精度”,尤其是涉及十进制小数或大整数/高精度计算时。
下面分点说明。
double 会丢精度?double 是 IEEE 754 64 位浮点数:
0.1)在二进制中是无限循环小数System.out.println(0.1 + 0.2);
输出:
0.30000000000000004
原因:0.1 和 0.2 都不能被 double 精确表示。
double money = 9.99;
money = money + 0.01; // 可能不是 10.00
⚠️ 绝对不要用 double 做钱的计算
if (a == b) // 可能永远不成立
应该:
Math.abs(a - b) < 1e-9
double d = 9007199254740993L;
System.out.println(d); // 精度丢失
double 只有 53 位有效数字
±2^53 范围内例如:
double a = 100;
double b = 200;
System.out.println(a + b); // 300
BigDecimalBigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b)); // 0.3
⚠️ 注意:不要用 new BigDecimal(0.1)
BigIntegerBigInteger big = new BigInteger("123456789012345678901234567890");
double不是“精确数”,而是“近似值”。
只要你在意精度(尤其是钱),就不要用double。
如果你愿意,我可以:
float / double / BigDecimal 对比表免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。