在 Java 中,double(双精度浮点数)遵循 IEEE 754 标准,由于二进制无法精确表示很多十进制小数(如 0.1),误差是不可避免的。但我们可以通过一些方式来避免或减小误差影响。
下面是常见且实用的做法:
double a = 0.1;
double b = 0.2;
System.out.println(a + b); // 0.30000000000000004
原因:
0.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");
==)❌ 错误:
if (a == b) { }
✅ 正确(允许误差范围):
double eps = 1e-9;
if (Math.abs(a - b) < eps) {
// 认为相等
}
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);
// 用分表示金额
long money = 30; // 0.30 元
这是金融系统最常见做法,完全无浮点误差。
❌ 不推荐:
double sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += 0.1;
}
✅ 改进:
BigDecimal| 场景 | 推荐 |
|---|---|
| 金额计算 | BigDecimal / 整数 |
| 科学计算 | double + 误差容忍 |
| UI 显示 | 四舍五入 |
| 循环累加 | BigDecimal / 整数 |
double 误差无法消除,只能规避。
- 要精确 →
BigDecimal- 要快 →
double+ 容差- 要绝对安全 → 用整数
如果你有具体业务场景(比如金额、坐标、算法),我可以给你更针对性的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。