温馨提示×

温馨提示×

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

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

java BigDecimal任意精度整数如何取余数

发布时间:2026-10-02 21:25:22 来源:亿速云 阅读:100 作者:小樊 栏目:编程语言

在 Java 里,BigDecimal 本身不是“任意精度整数”,它是任意精度的十进制浮点数。
如果你说的是任意精度整数取余数,应该用 BigInteger;如果你确实要用 BigDecimal 做“取余”,那是 decimal 取模(余数),不是整数除法余数。

下面分情况说明。


一、任意精度整数取余数(推荐用 BigInteger)

如果你要的是整数除法求余(mod),这是标准做法:

import java.math.BigInteger;

BigInteger a = new BigInteger("123456789012345678901234567890");
BigInteger b = new BigInteger("97");

BigInteger remainder = a.mod(b);   // 结果 >= 0
// 或
BigInteger remainder2 = a.remainder(b); // 符号同 a

区别:

  • mod(b):结果始终 非负
  • remainder(b):结果符号与被除数相同

✅ 这是“任意精度整数取余数”的正确方式


二、BigDecimal 的“取余数”(十进制余数)

BigDecimal 也有取余方法,但它是按小数精度来算的:

import java.math.BigDecimal;
import java.math.MathContext;

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

BigDecimal rem = a.remainder(b);
System.out.println(rem); // 1.5

规则:

a = b * q + r

其中 q 是整数(向零取整)

⚠️ 注意:

  • 结果精度取决于操作数
  • 不适合做“整数取模”用途
  • 金融计算中一般不要用 remainder

三、BigDecimal 转 BigInteger 后取余(常见需求)

如果你本来就是整数,只是用了 BigDecimal:

BigDecimal a = new BigDecimal("12345678901234567890");
BigDecimal b = new BigDecimal("97");

BigInteger rem = a.toBigInteger().mod(b.toBigInteger());

或先校验是否为整数:

if (a.stripTrailingZeros().scale() <= 0) {
    BigInteger rem = a.toBigIntegerExact().mod(b.toBigIntegerExact());
}

四、总结建议

需求 推荐方式
任意精度整数取余 BigInteger.mod()
小数取余 BigDecimal.remainder()
金融整数运算 BigInteger 或 long + 分单位
高精度但非整数 BigDecimal 慎用量

如果你能说一下具体业务场景(比如:金融、幂运算、大数算法),我可以给你更合适的写法。

向AI问一下细节

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

AI
助
手