温馨提示×

温馨提示×

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

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

Java Double 双精度如何避免误差

发布时间:2026-07-25 02:13:51 来源:亿速云 阅读:102 作者:小樊 栏目:编程语言

在 Java 中,doubleIEEE 754 64 位浮点数,本质上无法精确表示很多十进制小数(如 0.1),因此“误差”是不可避免的。我们能做的是:根据场景选择合适的方案来避免或控制误差

下面按实用性从高到低说明。


一、最推荐:使用 BigDecimal(金融/金额计算必用)

✅ 适用场景

  • 金额、利率、统计
  • 需要精确小数位
  • 需要四舍五入

✅ 正确用法(重点)

import java.math.BigDecimal;

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

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

⚠️ 千万不要这样写

new BigDecimal(0.1); // 错误!已经带误差

✅ 四舍五入(非常常用)

BigDecimal result = new BigDecimal("1.235")
        .setScale(2, BigDecimal.ROUND_HALF_UP);

System.out.println(result); // 1.24

✅ Java 8+ 推荐:

.setScale(2, RoundingMode.HALF_UP);

二、如果必须用 double,如何减少误差?

1️⃣ 设置误差容忍度(epsilon)

double a = 0.1 + 0.2;
double b = 0.3;

double eps = 1e-9;
System.out.println(Math.abs(a - b) < eps); // true

✅ 适合:

  • 科学计算
  • 图形、物理引擎

2️⃣ 避免多次累加 double

// 不推荐
double sum = 0.0;
for (int i = 0; i < 10000; i++) {
    sum += 0.1;
}

✅ 改进:

BigDecimal sum = BigDecimal.ZERO;
for (int i = 0; i < 10000; i++) {
    sum = sum.add(BigDecimal.valueOf(0.1));
}

三、用整数代替小数(非常实用)

✅ 金额用“分”而不是“元”

int amount = 100; // 表示 1.00 元
int total = amount * 3; // 3.00 元

✅ 优点:

  • 无误差
  • 性能高
  • 银行系统常用

四、比较 double 的正确方式

❌ 错误:

if (a == b) { }

✅ 正确:

if (Math.abs(a - b) < 1e-9) { }

或使用 BigDecimal

a.compareTo(b) == 0

五、什么时候可以放心用 double

✅ 可以用:

  • 科学计算
  • 图形、游戏
  • 不需要绝对精确

❌ 不要用:

  • 金额
  • 税率
  • 结算系统

六、总结(记住这 3 条就够了)

场景 推荐方案
金额 / 精确计算 BigDecimal
高性能整数 ✅ 用整数(分、毫秒)
科学 / 浮点 double + epsilon

如果你愿意,可以告诉我:

  • 你是在做 金额计算 / 算法 / 游戏 / 数据处理 哪一类?
  • 是否需要 代码示例 + 性能对比

我可以直接给你最优方案

向AI问一下细节

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

AI