温馨提示×

温馨提示×

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

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

java Double双精度会丢精度吗

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

简短结论:会,Java 的 double(双精度浮点数)在特定情况下一定会“丢精度”,尤其是涉及十进制小数大整数/高精度计算时。

下面分点说明。


1️⃣ 为什么 double 会丢精度?

doubleIEEE 754 64 位浮点数

  • 二进制存储
  • 很多十进制小数(如 0.1)在二进制中是无限循环小数
  • 只能近似存储 → 产生误差

经典例子

System.out.println(0.1 + 0.2);

输出:

0.30000000000000004

原因:0.10.2 都不能被 double 精确表示。


2️⃣ 哪些场景一定会出问题?

✅ 金额 / 金融计算(最危险)

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 位有效数字


3️⃣ 哪些情况“看起来没问题”?

  • 整数在 ±2^53 范围内
  • 不涉及小数
  • 只做粗略计算(科学计算、图形)

例如:

double a = 100;
double b = 200;
System.out.println(a + b); // 300

4️⃣ 正确的替代方案

✅ 金额:用 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)


✅ 整数大数:BigInteger

BigInteger big = new BigInteger("123456789012345678901234567890");

5️⃣ 总结一句话

double 不是“精确数”,而是“近似值”。
只要你在意精度(尤其是钱),就不要用 double

如果你愿意,我可以:

  • 给你画一张 float / double / BigDecimal 对比表
  • 或结合你具体业务场景给建议
向AI问一下细节

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

AI