先说结论:取模和取余在计算的目标上是一致的,只是商的不同,导致结果不同,取余和取模在被除数、除数同号时,结果是等同的,异号时会有区别。
那么 Why? 取模,取余是怎样计算的
在计算机中,对于整型数a,b来说,取模和取余两种运算都遵循相同的步骤:
1.求 整数商: c = a/b;
2.计算模或者余数: r = a - c * b
求模运算和求余运算有时候结果不同是因为在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。
- 取余运算在计算商值向0方向舍弃小数位
- 取模运算在计算商值向负无穷方向舍弃小数位
同时,也可以这样理解:
- 取余,遵循尽可能让商大的原则
- 取模,遵循尽可能让商小的原则
例如计算:-7 Mod 4
那么:a = -7;b = 4;
第一步:求整数商c为-1.75,如进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入);
第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 1,求余时r = -3。
归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。
当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。
下面是两种计算的效果
public class DemoTest { public static void main(String arg[]){ System.out.println("-7,4取模=" +Math.floorMod(-7,4)); System.out.println("-7,4取余=" +-7%4); System.out.println("7,-4取模=" +Math.floorMod(7,-4)); System.out.println("7,-4取余=" +7%-4); System.out.println("7,4取模=" +Math.floorMod(7,4)); System.out.println("-7,-4取余=" +-7%-4); } } /% 计算结果 -7,4取模=1 -7,4取余=-3 7,-4取模=-1 7,-4取余=3 7,4取模=3 -7,-4取余=-3 %/