Java 中的取余运算(Complementation)是 % ,而 取模运算 (Modulo Operation)是 Math.floorMod() ,取余和取模并不一致。
– 计算方法
对于整数 a,b 来说,取模运算和取余运算的过程相同:
- 求整数商:c=a/b
- 计算 模 或者余数:r=a−c×b
只是取模和取余在第一步求商的方法上有所不同:取余运算在取 c 的值时,向 0 方向舍入( fix() 函数);而取模运算在计算 c 的值时,向负无穷方向舍入( floor() 函数)。
– 代码例子
int a = 7, b = 4;
System.out.println(String.format("%d %% %d = %d, %d mod %d = %d", a, b, a % b, a, b, Math.floorMod(a, b)));
a = -7;
System.out.println(String.format("%d %% %d = %d, %d mod %d = %d", a, b, a % b, a, b, Math.floorMod(a, b)));
a = 7;
b = -4;
System.out.println(String.format("%d %% %d = %d, %d mod %d = %d", a, b, a % b, a, b, Math.floorMod(a, b)));
a = -7;
b = -4;
System.out.println(String.format("%d %% %d = %d, %d mod %d = %d", a, b, a % b, a, b, Math.floorMod(a, b)));
输出如下:
7 % 4 = 3, 7 mod 4 = 3
-7 % 4 = -3, -7 mod 4 = 1
7 % -4 = 3, 7 mod -4 = -1
-7 % -4 = -3, -7 mod -4 = -3
可以得出结论:
a mod b: 取模运算结果的符号和 b 一致,
a % b: 取余运算结果的符号和 a 一致。
注:C 和 C++ 中的 % 也为取余, Python 中的 % 为取模。
参考资料: