在 Java 里,BigDecimal 本身不是“任意精度整数”,它是任意精度的十进制浮点数。
如果你说的是任意精度整数取余数,应该用 BigInteger;如果你确实要用 BigDecimal 做“取余”,那是 decimal 取模(余数),不是整数除法余数。
下面分情况说明。
如果你要的是整数除法求余(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 也有取余方法,但它是按小数精度来算的:
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:
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 慎用量 |
如果你能说一下具体业务场景(比如:金融、幂运算、大数算法),我可以给你更合适的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。