JavaScript 余数/模数(%)

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

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减去4次,然后再没有足够的左数减去它而不改变符号。其余的是: 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