Java取余运算的基础语义
取余运算符的定义
在 Java 中,取余运算符是 %,用于计算两数相除后的余数。取余的结果的符号与被除数相同,这是理解它与“模”运算的关键差异点,避免在循环和位移等场景中产生误解。
例如,7 % 3 的结果是 1,-7 % 3 的结果是 -1。这组规律在多种数据类型上保持一致,帮助你快速判断表达式的结果方向。
int a = 7, b = 3;
int r = a % b; // 1
System.out.println(r);
与整除运算的关系
在 Java 中,整数除法得到的商会被向零截断,随之再计算 a = b * (a / b) + (a % b),保证等式成立。这一关系可以帮助你在调试时快速推导结果。
对于参与运算的数字符号,结果的符号仍然与被除数(左操作数)一致。因此,当被除数为负数时,取余结果也会是负数,这一点在边界条件判断时尤为重要。
System.out.println(-7 / 3); // -2
System.out.println(-7 % 3); // -1
%运算符在Java中的用法与示例
整型取余的基本示例
整型取余是最常见的用途之一,用于判断能否整除、以及实现循环模运算等场景。简单来说,x % y 可以告诉你 x 除以 y 后的剩余量。
需要注意的是,当除数为 0 时会抛出 ArithmeticException,所以在执行取余前应先进行除数检查,以避免运行时错误。
int x = 10, y = 4;
int r = x % y; // 2
System.out.println(r);
浮点数取余的行为
浮点数也可以使用 % 进行取余运算,结果是一个浮点数,遵循 IEEE 754 的模运算规则,例如 7.5 % 2.0 = 1.5。
对于含有 NaN 的运算,结果也是 NaN;当除数为 0.0 时,结果为 NaN,而不是抛出异常。
double d1 = 7.5, d2 = 2.0;
double rf = d1 % d2; // 1.5
System.out.println(rf);
实际应用场景:循环、环形缓冲、哈希分布等
循环索引的取余
在需要实现环形循环或环形缓冲时,通过取余可以实现对索引的回绕,避免越界访问或复杂的条件分支。

对于可能的负索引,建议使用一个归一化公式:(idx % n + n) % n,以获得非负的下标值,确保循环的稳定性。
int idx = -1;
int n = 5;
int wrap = (idx % n + n) % n; // 4
System.out.println(wrap);
边界条件与性能注意点
取余运算是 JVM 内部实现较为成熟的指令,但在高频循环中仍需关注性能与可读性。将模运算集中在少量表达式中,有助于提升可维护性。
如果你想要一个统一的非负取模方案,可以把逻辑封装成工具方法,以便于在不同模块之间复用,避免重复书写相同的按需处理逻辑。
public static int modNonNegative(int a, int m) {int r = a % m;return r < 0 ? r + m : r;
}
System.out.println(modNonNegative(-3, 5)); // 2


