使用 BigDecimal(尤其是配合 任意精度整数)的核心目的是为了 精确表示和计算十进制数,避免二进制浮点误差。下面分层说明。
float / double 的先天缺陷float 和 double 是 二进制浮点数(IEEE 754),很多十进制小数无法精确表示:
double a = 0.1;
System.out.println(a); // 可能是 0.10000000000000009
典型问题:
System.out.println(0.1 + 0.2 == 0.3); // false
原因:
✅ 金融、金额、精度敏感场景绝对不能用 double
BigDecimal 是 任意精度的十进制数(Arbitrary-precision decimal)
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b); // 精确等于 0.3
计算机中:
BigDecimal 的做法是:
0.12345
→ 内部存成整数 12345
→ 再记录 scale = 5
这样:
普通整数类型有上限:
| 类型 | 最大值 |
|---|---|
| int | 2³¹ - 1 |
| long | 2⁶³ - 1 |
而 BigInteger / BigDecimal:
new BigDecimal("9999999999999999999999999999999999999999")
✅ 理论无限(受内存限制)
BigDecimal price = new BigDecimal("19.99");
BigDecimal amount = new BigDecimal("3");
BigDecimal total = price.multiply(amount);
BigDecimal r = a.divide(b, 2, RoundingMode.HALF_UP);
double 无法做到这种精确舍入控制。
new BigDecimal(0.1); // 仍然是近似值
new BigDecimal("0.1");
BigDecimal.valueOf(0.1); // 内部转成字符串
| 优点 | 缺点 |
|---|---|
| 精确 | 性能比 double 慢 |
| 可控舍入 | 代码更繁琐 |
| 无溢出 | 对象不可变,频繁创建对象 |
✅ 在精度 > 性能的场景下,这是值得的
使用 BigDecimal(基于任意精度整数)是为了 在十进制下精确表示和计算数值,避免二进制浮点误差,尤其是在金融、金额、高精度计算中。
如果你愿意,我也可以:
BigDecimal vs double vs BigInteger免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。