HOWTO · JavaScript

JavaScript 中的模數運算子(%)

本教程講解如何在 JavaScript 中使用模數運算子(%)。

本頁內容

JavaScript 的 % 運算子會傳回除法後的餘數。對正數而言,結果通常與一般所說的模運算相同;但被除數為負數時,兩者的差異就會顯現:JavaScript 的餘數符號與被除數相同。本指南會說明語法、特殊數值情況與常見用法。

JavaScript 的 % 運算子會傳回什麼

對有限數值而言,a % b 會先將商 a / b 朝零截斷,再傳回餘數。以 10 % 3 為例,商是 3,餘數是 1。結果的符號與被除數(a)相同,因此 -10 % 3 的結果是 -1。這項符號規則說明了為什麼 JavaScript 的 % 是餘數運算子,且不一定會得到數學模運算所產生的非負結果。

語法與基本範例

依序寫出被除數、% 和除數:dividend % divisor。這個運算子接受數值運算元,包括小數。在運算式中,左側的值會除以右側的值,結果為一個數值,可供程式儲存、比較或傳入其他計算。以下範例將結果分別指定給具名常數,再把兩個值傳送到主控台:

const wholeRemainder = 10 % 3;
const fractionalRemainder = 5.5 % 2;
console.log(wholeRemainder);
console.log(fractionalRemainder);

第一個結果是 1;第二個是 1.5,因為 2 可以在 5.5 中整除兩次,剩下 1.5。本資料包提供的執行紀錄確認了這兩個輸出:1 和 1.5。

負數與邊界情況

餘數的符號與被除數相同:10 % 3 是 1、-10 % 3 是 -1,而 10 % -3 是 1。負數的整數倍可能產生負零,例如 -4 % 2;若零的符號很重要,可用 Object.is(-4 % 2, -0) 比較。

只要任一運算元是 NaN、被除數是無限值,或除數是 0 或 -0,JavaScript 就會傳回 NaN。有限的被除數搭配無限值除數時,結果則會原樣傳回被除數,因此 5 % Infinity 是 5。這些結果符合 JavaScript 的數值餘數語意;本資料包沒有提供這些情況的執行紀錄。

% 運算子的常見用途

輸入為整數時,可用 n % 2 === 0 判斷偶數,並用 n % 2 !== 0 判斷奇數。負整數也適用,因為其餘數會是 0 或 -1。如果輸入可能是小數或數字字串,請先驗證或正規化,再進行整數奇偶判斷。

對有限數值而言,value % 1 會得到帶有正負號的小數餘數。例如,5.5 % 1 是 0.5,而 -5.5 % 1 是 -0.5。若要取得負數的正小數部分,請明確選擇正規化規則,不要假設 % 1 一定是非負數。

若分鐘數是非負整數,可用 hours = Math.floor(minutes / 60) 和 remainingMinutes = minutes % 60 將分鐘拆分為小時與剩餘分鐘。例如,135 分鐘會換算為 2 小時和 15 分鐘。

若要讓迴圈每執行三次就進行某項操作,可檢查 i % 3 === 0。若要在陣列中的兩個項目間輪替,且 round 從 1 開始,可使用 (round - 1) % players.length;減去一可讓第一回合使用索引 0。這兩種寫法分別假設間隔為正數,或陣列至少包含一個項目。

餘數與數學模運算

數學上的模運算通常會傳回介於 0(含)與正模數(不含)之間的值。JavaScript 的 % 則保留被除數的符號,因此 -10 % 3 是 -1。若 n 是有限正數,運算式 ((a % n) + n) % n 可將有限數值 a 正規化為非負、類似模運算的結果。例如,模數為 3 時,這個運算式會將 -10 對應為 2。請明確保留模數為正數這項前提;此寫法不能普遍取代除數任意的 % 運算。