温馨提示×

温馨提示×

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

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

java Double双精度怎样避免误差

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

在 Java 中,double(双精度浮点数)遵循 IEEE 754 标准,由于二进制无法精确表示很多十进制小数(如 0.1),误差是不可避免的。但我们可以通过一些方式来避免或减小误差影响

下面是常见且实用的做法:


一、为什么 double 会有误差?

double a = 0.1;
double b = 0.2;
System.out.println(a + b); // 0.30000000000000004

原因:

  • 0.1 在二进制中是无限循环小数
  • double 只能保存有限位,必然会截断

二、避免 double 误差的常见方案

✅ 1. 使用 BigDecimal(最推荐)

适合:金额、精度要求高的计算

import java.math.BigDecimal;

BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b);

System.out.println(c); // 0.3

⚠️ 注意:不要用 new BigDecimal(double)

// 错误示范(仍有误差)
BigDecimal wrong = new BigDecimal(0.1);

// 正确方式
BigDecimal right = new BigDecimal("0.1");

✅ 2. 控制比较方式(不要直接 ==

❌ 错误:

if (a == b) { }

✅ 正确(允许误差范围):

double eps = 1e-9;
if (Math.abs(a - b) < eps) {
    // 认为相等
}

✅ 3. 四舍五入(展示或存储前)

double result = 0.1 + 0.2;
double fixed = Math.round(result * 100.0) / 100.0;
System.out.println(fixed); // 0.3

或使用 BigDecimal

BigDecimal bd = new BigDecimal("0.30000000000000004");
bd = bd.setScale(2, RoundingMode.HALF_UP);

✅ 4. 用整数代替小数(适合钱)

// 用分表示金额
long money = 30; // 0.30 元

这是金融系统最常见做法,完全无浮点误差。


✅ 5. 避免多次累积误差

❌ 不推荐:

double sum = 0;
for (int i = 0; i < 1000000; i++) {
    sum += 0.1;
}

✅ 改进:

  • BigDecimal
  • 或先转整数计算,再除回

三、不同场景推荐方案

场景 推荐
金额计算 BigDecimal / 整数
科学计算 double + 误差容忍
UI 显示 四舍五入
循环累加 BigDecimal / 整数

四、总结一句话

double 误差无法消除,只能规避。

  • 要精确 → BigDecimal
  • 要快 → double + 容差
  • 要绝对安全 → 用整数

如果你有具体业务场景(比如金额、坐标、算法),我可以给你更针对性的方案。

向AI问一下细节

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

AI