BigInteger.remainder() 返回数学意义上的非负余数,满足被除数 = 除数 × 商 + 余数且 0 ≤ 余数 < |除数|。

BigInteger.remainder() 方法用于计算大整数对另一个大整数取余(即模运算的余数部分),它返回的是**数学意义上的非负余数**,满足:被除数 = 除数 × 商 + 余数,且 0 ≤ 余数
remainder() 和 mod() 的关键区别
这是最容易混淆的地方:
-
remainder(divisor):行为类似 Java 基本类型
%运算符,结果符号与被除数一致(但 BigInteger 是不可变且无符号表示,所以实际效果是返回 带符号余数,可能为负)——注意:这个说法不准确,需修正。实际上,remainder() 返回的是满足 a == b.multiply(q).add(r) 的 r,其中 q = a.divide(b),r 可能为负; - mod(divisor):要求除数为正,返回非负最小剩余系(即标准模运算结果,0 ≤ result
✅ 正确理解:
- 若你调用 a.remainder(b),它等价于先算 a.divide(b)(向零截断),再用 a.subtract(b.multiply(quotient)) 得到余数;
- 所以当 a 为负、b 为正时,remainder() 结果可能为负;而 mod() 强制返回非负值。
正确使用 remainder() 的示例
假设你想计算 -100 对 7 的余数:
BigInteger a = new BigInteger("-100");
BigInteger b = BigInteger.valueOf(7);
BigInteger r1 = a.remainder(b); // 结果是 -2(因为 -100 / 7 = -14,-100 - 7*(-14) = -100 + 98 = -2)
BigInteger r2 = a.mod(b); // 结果是 5(标准模结果,-100 ≡ 5 (mod 7))如果你需要传统数学意义下的“余数”(总是 ≥ 0),优先用 mod(),前提是除数为正。
立即学习“Java免费学习笔记(深入)”;
使用 remainder() 的注意事项
- 除数不能为零,否则抛出
ArithmeticException; - 如果被除数为零,结果恒为
BigInteger.ZERO; - 若除数为负,
remainder()仍可工作,但余数符号取决于被除数和除数的符号组合,逻辑较复杂,建议避免用负除数; - 性能上,
remainder()和mod()都是 O(n²) 时间复杂度(n 为位数),对超大数要注意效率。
什么时候该用 remainder()?
多数日常场景推荐用 mod(),除非你明确需要匹配 Java 整数 % 的行为(比如移植已有逻辑、做底层算法验证)。例如:
- 实现哈希函数时想保持与
int % n一致的符号行为; - 调试或验证除法分解是否成立:
a.equals(b.multiply(a.divide(b)).add(a.remainder(b)))恒成立; - 某些协议规定必须使用向零取整的余数定义。


















