- JavaScript の数値型は整数と小数を区別しないが、数値を整数化したい時にどうするのがベストなのか?
Math
のメソッドを使うのが正攻法
// 切り上げ
Math.ceil( 3.5 ); // => 4
Math.ceil( -3.5 ); // => -3
// 切り捨て
Math.floor( 3.5 ); // => 3
Math.floor( -3.5 ); // => -4
// 四捨五入
Math.round( 3.5 ); // => 4
Math.round( -3.5 ); // => -3
parseInt()
でもできる
文字列を整数にパースする parseInt()
でも整数化できる、けど、本来は数値を整数化するためのメソッドじゃないし、MDN にも 引数が文字列でないなら文字列に変換される と書かれてるので、これはダメでしょ。
// 一見切り捨てだが、単純に文字列として見て小数点以後をカット
// してる感じなので、Math.floor とは負値の挙動が違う
parseInt( 3.5 ); // => 3
parseInt( -3.5 ); // => -3
ビット演算の副作用を使う
JavaScript でもC言語と同じビット演算ができるが、ビット演算時に強制的に整数化されるので、それを利用すると短い記述で整数化できる。関数を呼ばないので速そうにも見える。
b = 3.5;
a = b >> 0; // => 3
a = b | 0; // => 3
// その他、値の変わらないビット演算なら何でもOK
ただ、MDNのビット演算子の説明によると 32bit のフラグとして扱う との事で、符号付き 32bit 整数で表現できない数値でやると切り捨てられて数が変わる ので注意。
C言語から入ってきてる人なので、整数と小数を同じ型で扱う事に何のメリットも感じないし遅そうでイヤなんだけど、これ見てなおさら嫌悪感が増した。
で、どれがいいの?
実際に速度比較までやった記事を参考にさせてもらう限りでは、parseInt()
はやはり他の手段よりも遅い模様。そしてビット演算を使う方法は一見速そうな割には、Math.floor()
と大差ないみたい。
だったら可読性や意図しない挙動を避けるという意味で、素直に Math.floor()
でいいんじゃないですかね。