剩余模数()

余数/模数运算符(%)返回(整数)除法后的余数。

console.log( 42 %  10); //  2
console.log( 42 % -10); //  2
console.log(-42 %  10); // -2
console.log(-42 % -10); // -2
console.log(-40 %  10); // -0
console.log( 40 %  10); //  0

当一个操作数除以第二个操作数时,此运算符返回剩余的余数。当第一个操作数为负值时,返回值将始终为负值,反之亦然,为正值。

在上面的例子中,10 可以从 42 中减去四次,然后再没有足够的东西在没有改变符号的情况下再次减去。剩下的就是:42 - 4 * 10 = 2

余数运算符可能对以下问题有用:

  1. 测试整数是否(不)可被另一个数字整除:

     x % 4 == 0 // true if x is divisible by 4
     x % 2 == 0 // true if x is even number
     x % 2 != 0 // true if x is odd number
    

    0 === -0 开始,这也适用于 x <= -0

  2. [0, n) 间隔内实现值的循环递增/递减。

假设我们需要将整数值从 0 增加到(但不包括)n,所以 n-1 之后的下一个值变为 0。这可以通过这样的伪代码来完成:

var n = ...; // given n
var i = 0;
function inc() {
    i = (i + 1) % n;
}
while (true) {
    inc();
    // update something with i
}

现在概括上述问题并假设我们需要允许将该值从 0 递增和递减到(不包括)n,因此 n-1 之后的下一个值变为 0 并且 0 之前的前一个值变为 n-1

var n = ...; // given n
var i = 0;
function delta(d) { // d - any signed integer
    i = (i + d + n) % n; // we add n to (i+d) to ensure the sum is positive
}

现在我们可以调用 delta() 函数传递任何整数,包括正数和负数,作为 delta 参数。

使用模数来获得数字的小数部分

 var myNum = 10 / 4;       // 2.5
 var fraction = myNum % 1; // 0.5
 myNum = -20 / 7;          // -2.857142857142857
 fraction = myNum % 1;     // -0.857142857142857