Java整数除法向零截断、取模符号同被除数、除数为零必抛ArithmeticException;例如-5/2=-2,-5%2=-1,10/0异常。

Java 中整数除法和取模运算在遇到负数或零时,行为与数学直觉可能不一致,关键在于其严格遵循“向零取整”规则,且除数为零会直接抛出异常。
整数除法:向零截断,不是向下取整
Java 的 / 运算符对整数操作时,结果是商的整数部分,**舍去小数部分(即朝零方向截断)**,而非 floor 除法:
- 5 / 2 → 2(正数正常)
- -5 / 2 → -2(不是 -3!因为 -2.5 截断后是 -2)
- 5 / -2 → -2(同上,符号由被除数和除数共同决定,但截断方向不变)
- -5 / -2 → 2
取模运算:% 的结果符号始终与被除数一致
Java 中 % 运算满足恒等式:a == (a / b) * b + (a % b)。因此余数符号由被除数(a)决定,且绝对值小于 |b|:
- 5 % 2 → 1
- -5 % 2 → -1(因为 -5 == (-2) * 2 + (-1))
- 5 % -2 → 1(因为 5 == (-2) * (-2) + 1)
- -5 % -2 → -1(因为 -5 == 2 * (-2) + (-1))
除数为零:必定抛出 ArithmeticException
无论被除数是正、负还是零,只要除数为 0,整数除法(/)和取模(%)都会在运行时抛出 ArithmeticException:
立即学习“Java免费学习笔记(深入)”;
- 10 / 0 → 抛出异常
- -10 / 0 → 抛出异常
- 0 / 0 → 抛出异常
- 7 % 0 → 抛出异常
该异常无法通过常规算术逻辑规避,必须显式检查除数是否为零。
对比 Python 等语言:注意跨语言差异
Python 使用向下取整除法(//)和余数非负的取模(%),例如 -5 // 2 == -3,-5 % 2 == 1。而 Java 统一采用向零截断,导致相同表达式结果不同。迁移代码或做算法题时需特别留意该差异,不可假设语义一致。










