整数型 (Integer) は、JavaScript で奇妙な問題を引き起こすことがよくあります。 ECMAScript 仕様では、これらは概念としてのみ存在します:
すべての数値は浮動小数点数であり、整数は小数点のない単なる数値のセットです。
このブログでは、値が整数かどうかを確認する方法を説明します。
ECMAScript 5
ES5 では使用できるメソッドが多数あります。場合によっては、独自のメソッド、つまり関数 isInteger(x) を使用することもできます。この関数は、整数の場合は true を返し、それ以外の場合は false を返します。
いくつかの例を見てみましょう。
パス残量チェック
剰余演算 (%) を使用すると、数値の剰余を 1 で計算し、剰余が 0 かどうかを確認できます。
function isInteger(x) { return x % 1 === 0; }
この方法はとてもシンプルで効果的なので気に入っています。
> isInteger(17) true > isInteger(17.13) false
結果は最初の数値の符号に依存するため、剰余演算を行う場合は注意が必要です。それが正の場合、結果は負になります。
> 3.5 % 1 0.5 > -3.5 % 1 -0.5
その後、0 をチェックすることもできますが、これは実際には問題ではありません。しかし問題は、% が数値に変換するため、このメソッドは数値以外の場合にも true を返します。
> isInteger('') true > isInteger('33') true > isInteger(false) true > isInteger(true) true
非常に簡単な型チェックで解決できます:
function isInteger(x) { return (typeof x === 'number') && (x % 1 === 0); }
Math.round() を通じて、四捨五入後の数値が前の値と同じであれば、それは整数です。これは、JavaScript の Math.round() で確認できます:
function isInteger(x) { return Math.round(x) === x; }
この方法も良いです
> isInteger(17) true > isInteger(17.13) false
Math.round() は常に数値を返し、=== は型が同じ場合にのみ true を返すため、数値以外の値も判断できます。
> isInteger('') false
コードをもう少し明確にしたい場合は、型チェックを追加できます (これは以前のバージョンで行ったことです)。さらに、Math.floor() と Math.ceil() は Math.round() と同様に機能します。 ビット演算によるチェック ビット演算子は、「丸め」の別の方法を提供します:
function isInteger(x) { return (x | 0) === x; }
この解決策には (他のビット単位の演算と同様に) 欠陥があります。それは、32 ビットを超える数値を処理できないということです。
> isInteger(Math.pow(2, 32)) false
parseInt() によるチェック parseInt() は、数値を整数に変換する Math.round() と同様のメソッドも提供します。 なぜこの方法が良いのか見てみましょう。
function isInteger(x) { return parseInt(x, 10) === x; }
Math.round() ソリューションと同様に、数値以外の場合も処理できますが、すべての整数を正しく処理できるわけではありません。
> isInteger(1000000000000000000000) false
なぜですか? parseInt() は、整数を解析する前に、最初の引数を強制的に文字列として解析します。したがって、この方法を使用して数値を整数に変換することは良い選択ではありません。
> parseInt(1000000000000000000000, 10) 1 > String(1000000000000000000000) '1e+21'
上記と同様に、parseInt() は「1e 21」を解析する際に 1 で処理が停止したため、1 を返します。 ECMAScript 6 Math.round() に加えて、ES6 では整数に変換する別のメソッドが用意されています: Math .trunc()。この関数は、数値の小数部分を削除します。
> Math.trunc(4.1) 4 > Math.trunc(4.9) 4 > Math.trunc(-4.1) -4 > Math.trunc(-4.9) -4
さらに、ECMAScript 6 には組み込み関数 Number.isInteger() が付属しているため、整数をチェックするという簡単なタスクを処理する必要がありません。