剰余演算子 (%)
Baseline
広く利用可能
この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。
剰余演算子 (%) は、1 つ目のオペランドが 2 つ目のオペランドで除算されたときの余りである剰余を返します。これは常に被除数の符号を取ります。
試してみましょう
console.log(13 % 5);
// 予想される結果: 3
console.log(-13 % 5);
// 予想される結果: -3
console.log(4 % 2);
// 予想される結果: 0
console.log(-4 % 2);
// 予想される結果: -0
構文
x % y
解説
% 演算子は、数値と長整数の 2 種類のオペランドに対してオーバーロードされています。まず両オペランドを数値型に変換し、それらの型を検査します。両オペランドが長整数になった場合、長整数の剰余を実行します。そうでない場合は数値の剰余を実行します。一方のオペランドが長整数になり、もう一方が数値になった場合は、TypeError が発生します。
n % d の演算では、n を被除数、d を除数と呼びます。この演算処理は、オペランドのいずれかが NaN であるか、 n が ±無限大であるか、または d が ±0 である場合に NaN を返します。
両方のオペランドが 0 ではなく有限であるとき、剰余 r は r := n - d * q として計算されます。ここで q は、 r ができるだけ 0 に近く、被除数 n と同じ符号を持つ整数です。
なお、多くの言語では '%' はリマインダー演算子ですが、言語によっては(例えば Python や Perl では)モジュロ演算子になります。モジュロは k := n - d * q と定義されます。ここで q は k が除数 d と同じ符号を持ち、かつ使用可能な限り 0 に近い整数です。 2 つのオペランドの符号が同じであれば、両者は等価になりますが、オペランドの符号が異なる場合、オペランドの符号が異なる場合、モジュロの結果は符号が常に 除数 と同じになり、リマインダーは被除数と同じになります。 JavaScript でモジュロを得るには、 n % d の代わりに ((n % d) + d) % d を使用してください。 JavaScript では、ビット単位のシフト演算子(<<、>> など)の 2 つ目のオペランドを正規化するために、(専用の演算子のない)モジュロ演算が使用され、オフセットが常に正の値になります。
長整数型の除算では、被除数 y が 0n の場合に RangeError が発生します。これはゼロによる剰余は NaN を返しますが、長整数には NaN の概念がないからです。
例
>正の値の剰余
13 % 5; // 3
1 % -2; // 1
1 % 2; // 1
2 % 3; // 2
5.5 % 2; // 1.5
3n % 2n; // 1n
負の値の剰余
-13 % 5; // -3
-1 % 2; // -1
-4 % 2; // -0
-3n % 2n; // -1n
NaN の剰余
NaN % 2; // NaN
無限大の剰余
Infinity % 2; // NaN
Infinity % 0; // NaN
Infinity % Infinity; // NaN
2 % Infinity; // 2
0 % Infinity; // 0
仕様書
| 仕様書 |
|---|
| ECMAScript® 2027 Language Specification> # sec-multiplicative-operators> |
ブラウザーの互換性
関連情報
- 加算演算子 (
+) - 減算演算子 (
-) - 除算演算子 (
/) - 乗算演算子 (
*) - べき乗演算子 (
**) - インクリメント演算子 (
++) - デクリメント演算子 (
--) - 単項マイナス演算子 (
-) - 単項プラス演算子 (
+) - Remainder operator vs. modulo operator by Dr. Axel Rauschmayer (2019)