剩餘模數()

餘數/模數運算子(%)返回(整數)除法後的餘數。

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