温馨提示×

温馨提示×

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

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

BigDecimal任意精度整数怎么取值

发布时间:2026-07-17 10:19:41 来源:亿速云 阅读:110 作者:小樊 栏目:编程语言

在 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 由三部分组成:

BigDecimal = 整数值 + 小数位数(scale)

例如:

new BigDecimal("123.456")  // 值=123456, scale=3
new BigDecimal("123")      // 值=123, scale=0

scale = 0 时,就是“整数形式”。


三、取整数部分(最常用)

✅ 1. setScale(0, RoundingMode)

BigDecimal bd = new BigDecimal("12.78");

BigDecimal intPart = bd.setScale(0, RoundingMode.DOWN);
System.out.println(intPart); // 12

✅ 推荐方式
DOWN 表示直接截断小数部分(不是四舍五入)


✅ 2. 不同取整方式对比

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 四舍五入

四、转成真正的“任意精度整数”(BigInteger)

✅ 1. toBigInteger()(可能丢精度)

BigDecimal bd = new BigDecimal("12.99");

BigInteger i = bd.toBigInteger();
System.out.println(i); // 12

⚠️ 小数部分直接丢弃


✅ 2. 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)
  • ✅ 转 BigInteger 用 toBigIntegerExact()
  • ✅ 永远不要强制转 int / long

如果你有具体场景(比如:保留整数部分继续运算 / 金融金额 / 数学取整 / 和 BigInteger 混用),可以直接贴代码,我可以给你最优写法。

向AI问一下细节

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

AI
助
手