在 Java 里,BigDecimal 本身不是整数类型,它是“任意精度的十进制数”。
如果你说的 “任意精度整数” 通常指的是:
BigInteger(真正的任意精度整数)BigDecimal 用来存“整数值”(scale = 0)下面分情况说明 舍入(Rounding) 的方式。
BigDecimal 舍入必须指定 RoundingMode,否则会抛异常:
ArithmeticException: Rounding necessary
| 模式 | 说明 |
|---|---|
UP |
远离零 |
DOWN |
趋向零(直接截断) |
CEILING |
向 +∞ |
FLOOR |
向 -∞ |
HALF_UP |
四舍五入(最常用) |
HALF_DOWN |
五舍六入 |
HALF_EVEN |
银行家舍入(偶数优先) |
UNNECESSARY |
不允许舍入,有小数就异常 |
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
BigDecimal bd = new BigDecimal("123.999");
BigDecimal r = bd.setScale(0, RoundingMode.DOWN); // 123
BigDecimal bd = new BigDecimal("123.001");
BigDecimal r = bd.setScale(0, RoundingMode.CEILING); // 124
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 bd = new BigDecimal("123.9");
BigInteger i1 = bd.toBigInteger(); // 123(截断)
BigInteger i2 = bd.setScale(0, RoundingMode.HALF_UP)
.toBigInteger(); // 124
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();
RoundingModesetScale(0, mode)HALF_UP如果你有具体场景(金额?分页?数学计算?),我可以给你更合适的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。