在 Java 里,BigDecimal 本身并不是任意精度整数,它内部是
BigInteger unscaledValue × 10^(-scale)。
如果你想把 BigDecimal 转成任意精度整数(BigInteger),要根据具体场景决定怎么转。
BigDecimal 表示的就是整数(没有小数位)BigDecimal bd = new BigDecimal("12345678901234567890");
BigInteger bi = bd.toBigInteger();
System.out.println(bi);
✅ 不会丢精度
BigDecimal bd = new BigDecimal("12345.6789");
BigInteger bi = bd.toBigInteger(); // 12345
等价于:
Math.floor(bd)
BigDecimal bd = new BigDecimal("12345.6789");
BigInteger bi = bd
.setScale(0, RoundingMode.HALF_UP) // 四舍五入
.toBigInteger();
✅ 结果是:12346
| 模式 | 含义 |
|---|---|
HALF_UP |
四舍五入 |
DOWN |
直接截断 |
UP |
只要有小数就进 1 |
FLOOR |
向负无穷 |
CEILING |
向正无穷 |
BigDecimal bd = new BigDecimal("12345.00");
BigInteger bi = bd.toBigIntegerExact();
如果:
BigDecimal bd = new BigDecimal("12345.67");
bd.toBigIntegerExact(); // ❌ ArithmeticException
✅ 用于金融、金额系统最常见
BigDecimal = BigInteger × 10^(-scale)
例如:
new BigDecimal("123.45")
等价于:
unscaledValue = 12345
scale = 2
你可以直接拿“未缩放整数”:
BigInteger unscaled = bd.unscaledValue(); // 12345
int scale = bd.scale(); // 2
⚠️ 注意:这 不是 原始数值的整数部分,而是 ×10^scale 后的值。
| 需求 | 推荐方式 |
|---|---|
| 已知一定是整数 | toBigInteger() |
| 只取整(截断) | toBigInteger() |
| 四舍五入 | setScale(0, rounding) + toBigInteger() |
| 必须精确 | toBigIntegerExact() |
| 要原始缩放值 | unscaledValue() |
BigDecimal → BigInteger永远要注意:你到底是要“取整”“舍入”还是“精确转换”。
如果你有具体业务场景(比如金额、百分比、幂运算),可以直接贴代码,我可以帮你选最合适的一种。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。