Java负数取模结果符号与被除数相同,因a/b向零取整,故a%b恒等于a-(a/b)*b;需非负余数时可用((a%b)+Math.abs(b))%b修正。

Java 中负数取模(% 运算符)的结果遵循「向零取整」的除法规则,即:结果的符号与被除数(左操作数)相同,且满足:被除数 = 除数 × 商 + 余数,其中商是 Math.floorDiv() 的反向逻辑——实际是截断小数部分(朝零取整)。
核心规则:余数符号跟随被除数
Java 的 % 不是数学意义上的“最小非负剩余”,而是基于 / 运算定义的:
-
a % b的值恒等于a - (a / b) * b - 而
a / b是「向零取整」的整数除法(如-7 / 3 == -2,不是 -3;7 / -3 == -2) - 因此余数符号始终与
a(被除数)一致
常见情况对照表
以下例子清晰体现规律:
-
7 % 3 == 1(正÷正 → 正余数) -
-7 % 3 == -1(负÷正 → 负余数;因为-7 / 3 == -2,所以-7 - (-2)*3 == -1) -
7 % -3 == 1(正÷负 → 正余数;7 / -3 == -2,所以7 - (-2)*(-3) == 1) -
-7 % -3 == -1(负÷负 → 负余数;-7 / -3 == 2,所以-7 - 2*(-3) == -1)
想得到数学上惯用的非负余数?手动调整
如果需要类似 Python 的「非负模结果」(即结果 ∈ [0, |b|)),可用以下方式修正:
立即学习“Java免费学习笔记(深入)”;
- 通用写法:
((a % b) + Math.abs(b)) % b - 更高效(避免重复取模):
int r = a % b; if (r - 示例:
-7 % 3得-1,加3后得2,即符合数学期望的余数
注意:和 C/C++ 一致,但不同于 Python
Java 和 C/C++ 都采用「向零取整」的取模语义;而 Python 使用「向下取整」(floor division),所以 -7 % 3 在 Python 中是 2。跨语言开发时需特别留意该差异,不可假设行为统一。


















