在 Java 里,BigDecimal 本身并不会产生“任意精度整数误差”,但使用方式不当确实会产生看起来像误差的小数问题。重点是:不要用 double 构造 BigDecimal。
下面按“问题 → 原因 → 正确做法”来说明。
double 转 BigDecimalBigDecimal a = new BigDecimal(0.1);
System.out.println(a);
输出类似:
0.1000000000000000055511151231257827021181583404541015625
double 本身是 二进制浮点数0.1 在二进制中无法精确表示new BigDecimal(double) 会保留这个不精确值BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b);
System.out.println(c); // 0.3
✅ 完全精确,无误差
valueOf(double)(推荐)BigDecimal a = BigDecimal.valueOf(0.1);
BigDecimal b = BigDecimal.valueOf(0.2);
BigDecimal c = a.add(b);
System.out.println(c); // 0.3
✅ 内部会转换为字符串
✅ 比 new BigDecimal(double) 安全
// 用“分”而不是“元”
BigDecimal amount = new BigDecimal("100"); // 100 分 = 1 元
✅ 完全避免小数问题
✅ 银行、支付系统常用方案
BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal c = a.divide(b, 2, RoundingMode.HALF_UP);
BigDecimal 的 整数部分是任意精度BigDecimal c = a.divide(b); // 除不尽会抛异常
BigDecimal c = a.divide(b, 4, RoundingMode.HALF_UP);
✅ 避免误差的核心原则
new BigDecimal(double)new BigDecimal("x.x")BigDecimal.valueOf(double)scale + RoundingModeBigDecimal 没有精度误差,误差来自 double。
只要用字符串或 valueOf,它就是精确计算。
如果你愿意,我可以帮你:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。