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而无需更改符号。因此,其余为:42 - 4 * 10 = 2。

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

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

     x % 4 == 0 // 如果x可被4整除,则为true
    x % 2 == 0 // 如果x是偶数,则为true
    x % 2 != 0 // 如果x为奇数,则为true

    因为0 === -0,这也适用x <= -0。

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

假设我们需要将整数值从递增0(但不包括在内)n,因此aftern-1成为下一个值0。这可以通过以下伪代码完成:

var n = ...; // 给定n
var i = 0;
function inc() {
    i = (i + 1) % n;
}
while (true) {
    inc();
    // 跟我更新
}

现在,对上述问题进行一般化,并假设我们需要允许将该值从0to递增和递减(不包括)n,因此,n-1成为之后的下一个值0和0成为之前的前一个值n-1。

var n = ...; // 给定n
var i = 0;
function delta(d) { // d-任何有符号整数
    i = (i + d + n) % n; // 我们将n加到(i + d)以确保总和为正
}

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


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

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