温馨提示×

温馨提示×

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

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

java BigDecimal任意精度整数如何舍入

发布时间:2026-10-02 20:11:20 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

在 Java 中,BigDecimal 本身不限制整数位数(任意精度整数),但当需要舍入(rounding)时,通常是在小数运算或**指定 scale(小数位数)**的场景下才会用到。下面分情况说明。


一、BigDecimal 的“任意精度整数”本质

BigDecimal a = new BigDecimal("123456789012345678901234567890");
  • 这是一个整数值
  • scale() == 0
  • 没有任何舍入问题(整数不会被舍入)

✅ 整数本身不需要舍入


二、什么时候需要舍入?

只有以下情况才需要:

  1. 做了除法(divide)
  2. 显式设置小数位(setScale)
  3. 从浮点类型转换(double → BigDecimal)

三、常用舍入模式(RoundingMode)

java.math.RoundingMode:

模式 说明
UP 远离零方向
DOWN 向零方向(截断)
CEILING 向正无穷
FLOOR 向负无穷
HALF_UP 四舍五入(最常用)
HALF_DOWN 五舍六入
HALF_EVEN 银行家舍入
UNNECESSARY 不允许舍入(有误差会抛异常)

四、整数 → 指定小数位(舍入示例)

BigDecimal num = new BigDecimal("12345");

// 保留 2 位小数,四舍五入
BigDecimal r1 = num.setScale(2, RoundingMode.HALF_UP);
// 12345.00
BigDecimal num = new BigDecimal("12345.678");

BigDecimal r2 = num.setScale(2, RoundingMode.HALF_UP);
// 12345.68

BigDecimal r3 = num.setScale(2, RoundingMode.DOWN);
// 12345.67

五、除法运算必须指定舍入

❌ 错误写法(可能抛异常):

BigDecimal result = new BigDecimal("10").divide(new BigDecimal("3"));
// ArithmeticException: Non-terminating decimal expansion

✅ 正确写法:

BigDecimal result = new BigDecimal("10")
        .divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP);
// 3.33

六、整数除法(取整除 + 余数)

如果你只是想做整数运算,不要用舍入:

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");

BigDecimal quotient = a.divideToIntegralValue(b); // 3
BigDecimal remainder = a.remainder(b);            // 1

七、总结

  • ✅ BigDecimal 整数本身任意精度,不需要舍入
  • ✅ 舍入只在:
    • 设置小数位
    • 除法
    • 浮点转换
  • ✅ 始终显式指定 RoundingMode
  • ❌ 不要依赖默认舍入(会抛异常)

如果你有具体业务场景(如金额、比例、税额、分页),我可以给你更合适的写法。

向AI问一下细节

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

AI
助
手