结论先给出:
BigDecimal 用于“整数精度”时,精度是“够的”,但前提是你理解它的原理和使用方式。
下面分几点说明。
BigDecimal 的整数精度为什么“理论上无限”BigDecimal 内部并不是用 long,而是用:
比如:
BigDecimal bd = new BigDecimal("123456789123456789123456789");
这个数字是不会溢出的,只要内存够。
✅ 所以:
表示“整数”时,BigDecimal 的整数精度不受 64 位、128 位限制。
new BigDecimal("123456789123456789123456789")
✔ 字符串构造,精确,无限精度
new BigDecimal(0.1)
❌ 这是 double → BigDecimal,已经有精度损失了
因为 0.1 在 double 里本来就不是精确的
BigDecimal bd = BigDecimal.valueOf(0.1);
valueOf(double) 会比 new BigDecimal(double) 好一点,但仍然是 基于 double 的近似值
BigDecimal 的“精度”容易混淆的两个概念BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("3");
System.out.println(a.divide(b)); // ❌ 会抛异常
✅ 必须指定精度和舍入方式:
a.divide(b, 10, RoundingMode.HALF_UP);
| 类 | 适用场景 |
|---|---|
BigInteger |
纯整数,无小数 |
BigDecimal |
金融、金额、需要小数但又要精确 |
如果你只关心整数精度:
BigInteger 更轻、更直接BigDecimal 也完全没问题BigDecimal 在以下情况不是问题本身,而是使用问题:
scale / RoundingModedouble 先算完再转 BigDecimal(已经晚了)✅ BigDecimal 的整数精度是“任意精度”的,只要:
double 参与如果你愿意,可以告诉我:
我可以给你更具体的建议或代码示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。