BigDecimal 并不是“任意精度整数”,而是 任意精度的小数(定点数)。
如果你只关心任意精度整数,真正对应的是 BigInteger。
不过,BigDecimal 可以安全地表示任意精度整数,原因如下:
BigInteger 存“未缩放的值”BigDecimal bd = new BigDecimal("123456789123456789123456789");
在 BigDecimal 内部,本质结构是:
value = unscaledValue × 10^(-scale)
其中:
unscaledValue:BigIntegerscale:小数点位数(整数)✅ BigInteger 支持任意精度整数
不像:
int(32 位)long(64 位)double(IEEE 754 浮点)BigDecimal 的大小只受 内存限制。
BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal("3");
BigDecimal c = a.divide(b, 10, RoundingMode.HALF_UP);
✅ 不会像 double 那样出现:
0.1 + 0.2 != 0.3
| 特性 | BigDecimal | BigInteger |
|---|---|---|
| 是否支持小数 | ✅ 支持 | ❌ 不支持 |
| 是否支持任意精度整数 | ✅ 支持 | ✅ 支持 |
| 是否适合金额计算 | ✅ 非常适合 | ⚠️ 需自己处理小数位 |
| 性能 | 稍慢 | 更快 |
| 常用场景 | 金融、价格、税率 | 大整数运算 |
✅ 如果只做整数运算,优先用 BigInteger
现实中金额往往是:
123456789123456789.89
这就需要:
这正是 BigDecimal 的设计目的。
✅ 更准确的说法:
BigDecimal 是“任意精度定点数”
✅ 实际上:
BigInteger 更快BigDecimal 更合理✅ 用 BigDecimal 当:
✅ 用 BigInteger 当:
BigDecimal 之所以能表示任意精度整数,是因为它内部使用
BigInteger作为未缩放值,并且不限制数值大小,同时避免了浮点误差。
如果你愿意,我可以:
double / float / BigDecimal 的精度差异BigDecimal 的坑(如 new BigDecimal(0.1))免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。