两者的区别:
对于整型数x,y来说,取模运算或者求余运算的方法都是:
1.求整数商:int r = x / y;
2.计算模或者余数:int result = x - y * r;
求模运算和求余运算在第一步不同:如果r的值时负数且不为整数时,取余运算在取r的值时,向0放行舍入(fix()函数);而取模运算在计算r的值时,向负无穷方向舍入(floor()函数);如果r为整数则没有区别。
例如:
x = -5 , y = 3 , r = -5 / 3 = -1.66
取余时,r = -1 ,result = -5 - 3 * (-1)= -2
取模时,r = -2 ,result = -5 -3 * (-2)= 1
Java程序示例:
public class test {
public static void main(String[] agrs){
System.out.println("x=-5,y=3取余结果为:"+(-5)%3);
System.out.println("x=-5,y=3取模结果为:"+Math.floorMod(-5,3));
System.out.println("x=5,y=3取余结果为:"+5%3);
System.out.println("x=5,y=3取模结果为:"+Math.floorMod(5,3));
}
}
运行结果:
x=-5,y=3取余结果为:-2
x=-5,y=3取模结果为:1
x=5,y=3取余结果为:2
x=5,y=3取模结果为:2
代码实现:
求result:
public static int floorMod(int x, int y) {
int r = x - floorDiv(x, y) * y;
return r;
}
求r:
public static int floorDiv(int x, int y) {
int r = x / y;
// if the signs are different and modulo not zero, round down
if ((x ^ y) < 0 && (r * y != x)) {
r--;
}
return r;
}