在 BigDecimal(不管是 Java 的还是 C# 的 decimal,通常都指 Java)里,“任意精度整数”,正确取值方式取决于你到底想要什么结果**。下面按常见场景说明。
| 需求 | 正确做法 |
|---|---|
| 只取整数部分 | bd.setScale(0, RoundingMode.DOWN) |
| 向下取整 | bd.setScale(0, RoundingMode.FLOOR) |
| 向上取整 | bd.setScale(0, RoundingMode.CEILING) |
| 四舍五入取整 | bd.setScale(0, RoundingMode.HALF_UP) |
转成 BigInteger |
bd.toBigInteger() |
转成 BigInteger(精确) |
bd.toBigIntegerExact() |
| 判断是否为整数 | `bd.scale() <= 0 |
BigDecimal 由三部分组成:
BigDecimal = 整数值 + 小数位数(scale)
例如:
new BigDecimal("123.456") // 值=123456, scale=3
new BigDecimal("123") // 值=123, scale=0
scale = 0 时,就是“整数形式”。
setScale(0, RoundingMode)BigDecimal bd = new BigDecimal("12.78");
BigDecimal intPart = bd.setScale(0, RoundingMode.DOWN);
System.out.println(intPart); // 12
✅ 推荐方式
DOWN表示直接截断小数部分(不是四舍五入)
BigDecimal bd = new BigDecimal("-12.78");
bd.setScale(0, RoundingMode.DOWN); // -12
bd.setScale(0, RoundingMode.FLOOR); // -13
bd.setScale(0, RoundingMode.CEILING); // -12
bd.setScale(0, RoundingMode.HALF_UP); // -13
| RoundingMode | 含义 |
|---|---|
DOWN |
直接截断 |
FLOOR |
向负无穷 |
CEILING |
向正无穷 |
HALF_UP |
四舍五入 |
toBigInteger()(可能丢精度)BigDecimal bd = new BigDecimal("12.99");
BigInteger i = bd.toBigInteger();
System.out.println(i); // 12
⚠️ 小数部分直接丢弃
toBigIntegerExact()(推荐)BigDecimal bd = new BigDecimal("12.00");
BigInteger i = bd.toBigIntegerExact();
System.out.println(i); // 12
BigDecimal bd = new BigDecimal("12.01");
bd.toBigIntegerExact(); // ❌ ArithmeticException
✅ 只有本身是“精确整数”才能成功
boolean isInteger = bd.scale() <= 0
|| bd.stripTrailingZeros().scale() <= 0;
例如:
new BigDecimal("12.0").stripTrailingZeros().scale() == 0 ✅
intValue() / longValue()bd.intValue(); // 溢出无提示
new BigInteger(bd.toString())new BigInteger(bd.toString()); // 有小数点会异常
想要 BigDecimal 的“任意精度整数”
setScale(0, RoundingMode)toBigIntegerExact()如果你有具体场景(比如:保留整数部分继续运算 / 金融金额 / 数学取整 / 和 BigInteger 混用),可以直接贴代码,我可以给你最优写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。