温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

BigDecimal任意精度整数怎么转换

发布时间:2026-07-17 09:59:38 来源:亿速云 阅读:97 作者:小樊 栏目:编程语言

在 Java 里,BigDecimal 本身并不是任意精度整数,它内部是
BigInteger unscaledValue × 10^(-scale)。
如果你想把 BigDecimal 转成任意精度整数(BigInteger),要根据具体场景决定怎么转。


一、最常见方式(推荐)

1️⃣ 如果 BigDecimal 表示的就是整数(没有小数位)

BigDecimal bd = new BigDecimal("12345678901234567890");
BigInteger bi = bd.toBigInteger();
System.out.println(bi);

✅ 不会丢精度


2️⃣ 如果你只想要整数部分(舍弃小数)

BigDecimal bd = new BigDecimal("12345.6789");
BigInteger bi = bd.toBigInteger(); // 12345

等价于:

Math.floor(bd)

二、四舍五入再转整数(常用)

3️⃣ 指定舍入方式

BigDecimal bd = new BigDecimal("12345.6789");

BigInteger bi = bd
        .setScale(0, RoundingMode.HALF_UP) // 四舍五入
        .toBigInteger();

✅ 结果是:12346

常用 RoundingMode

模式 含义
HALF_UP 四舍五入
DOWN 直接截断
UP 只要有小数就进 1
FLOOR 向负无穷
CEILING 向正无穷

三、精确转整数(不能丢精度)

4️⃣ 如果小数位不为 0 就抛异常(最安全)

BigDecimal bd = new BigDecimal("12345.00");

BigInteger bi = bd.toBigIntegerExact();

如果:

BigDecimal bd = new BigDecimal("12345.67");
bd.toBigIntegerExact(); // ❌ ArithmeticException

✅ 用于金融、金额系统最常见


四、BigDecimal ↔ BigInteger 本质关系

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 永远要注意:你到底是要“取整”“舍入”还是“精确转换”。

如果你有具体业务场景(比如金额、百分比、幂运算),可以直接贴代码,我可以帮你选最合适的一种。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手