温馨提示×

温馨提示×

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

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

java BigDecimal任意精度整数怎舍入

发布时间:2026-10-23 10:47:31 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

在 Java 里,BigDecimal 本身不是整数类型,它是“任意精度的十进制数”。
如果你说的 “任意精度整数” 通常指的是:

  • BigInteger(真正的任意精度整数)
  • 或 BigDecimal 用来存“整数值”(scale = 0)

下面分情况说明 舍入(Rounding) 的方式。


一、BigDecimal 的舍入核心规则

BigDecimal 舍入必须指定 RoundingMode,否则会抛异常:

ArithmeticException: Rounding necessary

常用舍入模式(RoundingMode)

模式 说明
UP 远离零
DOWN 趋向零(直接截断)
CEILING 向 +∞
FLOOR 向 -∞
HALF_UP 四舍五入(最常用)
HALF_DOWN 五舍六入
HALF_EVEN 银行家舍入(偶数优先)
UNNECESSARY 不允许舍入,有小数就异常

二、BigDecimal 当作“整数”时的舍入

1️⃣ 保留为整数(scale = 0)

BigDecimal bd = new BigDecimal("123.456");

BigDecimal r1 = bd.setScale(0, RoundingMode.HALF_UP);   // 123
BigDecimal r2 = bd.setScale(0, RoundingMode.UP);        // 124
BigDecimal r3 = bd.setScale(0, RoundingMode.DOWN);      // 123
BigDecimal r4 = bd.setScale(0, RoundingMode.FLOOR);     // 123

2️⃣ 向下取整(等同 int 截断)

BigDecimal bd = new BigDecimal("123.999");
BigDecimal r = bd.setScale(0, RoundingMode.DOWN); // 123

3️⃣ 向上取整

BigDecimal bd = new BigDecimal("123.001");
BigDecimal r = bd.setScale(0, RoundingMode.CEILING); // 124

三、BigInteger(真正的任意精度整数)

BigInteger 没有小数,不存在“舍入”,只有:

  • 除法(需指定舍入)
  • 取整(本身就是整数)

BigInteger 除法 + 舍入

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

BigInteger r1 = a.divide(b); // 3(向零截断)

// 向上取整
BigInteger r2 = a.add(b.subtract(BigInteger.ONE))
                  .divide(b); // 4

四、BigDecimal ↔ BigInteger

BigDecimal → BigInteger(舍入)

BigDecimal bd = new BigDecimal("123.9");

BigInteger i1 = bd.toBigInteger();                    // 123(截断)
BigInteger i2 = bd.setScale(0, RoundingMode.HALF_UP)
                  .toBigInteger();                    // 124

BigInteger → BigDecimal

BigInteger i = new BigInteger("123");
BigDecimal bd = new BigDecimal(i); // scale = 0

五、推荐做法(重要)

✅ 不要直接 intValue() / longValue()(会溢出或截断)
✅ 先 setScale(0, RoundingMode) 再转

BigDecimal bd = new BigDecimal("999999999999999999.9");

// 安全方式
BigInteger result = bd.setScale(0, RoundingMode.HALF_UP)
                      .toBigInteger();

六、总结一句话

  • BigDecimal:必须指定 RoundingMode
  • 整数舍入:setScale(0, mode)
  • BigInteger:没有小数,不需要舍入
  • 最常用:HALF_UP

如果你有具体场景(金额?分页?数学计算?),我可以给你更合适的写法。

向AI问一下细节

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

AI
助
手