在研究HashMap时,看到了取模方法,因此研究了下取模和取余的区别
一、取模与取余的区别
取模:mod,取余:rem
x | 7 | -7 | 7 | -7 |
y | -2 | 2 | 2 | -2 |
% | 1 | -1 | 1 | -1 |
mod | -1 | 1 | 1 | -1 |
当x和y的正负号一样的时候,两个函数结果是等同的;当x和y的符号不同时,rem函数结果的符号和x的一样,而mod和y一样。
这是由于这两个函数的生成机制不同,rem函数采用fix函数,而mod函数采用了floor函数(这两个函数是用来取整的,fix函数向0方向舍入,floor函数向无穷小方向舍入)。
即:当除数与被除数的符号相同时,rem和mod的结果是完全相同的;当除数与被除数的符号不相同时,结果不同。
具体而言,rem结果的符号与被除数相同;mod结果的符号与除数相同。
因为HashMap中的hash和length都是正数,所以取模和取余结果一样。
二、Java中mod和%区别
类BigInteger中有取模(mod)和取余(remainder)方法
实例:
public static void main(String[] args) { // TODO Auto-generated method stub Map<Integer, Integer> map = new HashMap<>(); BigInteger b1, b2, b3, b4; b1 = new BigInteger("-7"); b2 = new BigInteger("2"); b3 = b1.mod(b2); b4 = b1.remainder(b2); System.out.println("b3: " + b3); System.out.println("b4: " + b4); int i1 = -7; int i2 = 2; int i3 = i1 % i2; System.out.println("i3: " + i3); }
结果:
通过取模mod()方法计算出来的值都是非负数,特别是取模里面的参数b2必须为正数。
但对取余remainder()方法中,对被除数和除数没有特殊要求,只要求除数不能为零。(通过%求余出来的数值,正数、负数、0都可以。)
参考: