HOWTO · JavaScript
JavaScript で浮動小数点数を整数に変換する方法
JavaScript の Number を切り捨てまたは丸めし、10進文字列を解析し、安全でないビット演算の近道を避ける方法を説明します。
このページの内容
JavaScriptにはintとfloatという別々の型はなく、通常はどちらもNumberで表されます。既存の数値から小数部分を取り除くには、0に近づく方向へ切り捨てるMath.trunc()を使います。この操作を0方向への切り捨てと呼びます。
console.log(Math.trunc(12.75));
console.log(Math.trunc(-12.75));
出力:
12
-12
適切な方法は、必要な結果によって異なります。
Math.trunc(value)は小数部分を0方向へ切り捨てる場合に使います。- 丸める方向が重要なら
Math.floor(value)またはMath.ceil(value)を使います。 - 最も近い整数を選ぶには
Math.round(value)を使います。 - 入力が小数の文字列なら
parseInt(text, 10)を使い、Numberの切り捨てには通常これを使いません。
Math.trunc()で数値を切り捨てる
Math.trunc()は丸めずに数値の整数部分を返します。正の値では小数点以降を削除し、負の値では0に近づくため、-12.75は-13ではなく-12になります。
const value = -12.75;
console.log(Math.trunc(12.75));
console.log(Math.trunc(value));
出力:
12
-12
値がすでに数値で、整数部分だけを残したい場合には、通常これが最も明快です。-1から0の間の値では負の0が生成されることがあります。
console.log(Object.is(Math.trunc(-0.5), -0));
出力:
true
アプリケーションで-0と0を区別する必要がある場合は、明示的に処理してください。
丸めにはfloor()、ceil()、round()を選ぶ
切り捨てと丸めは異なる操作です。Math.floor()は値以下の最大の整数を、Math.ceil()は値以上の最小の整数を返します。この違いは負の値で特に重要です。
const value = -12.75;
console.log(Math.floor(value));
console.log(Math.ceil(value));
console.log(Math.round(-1.5));
出力:
-13
-12
-1
下限にはMath.floor()、上限にはMath.ceil()、最も近い整数にはMath.round()を使います。JavaScriptのMath.round()は同値の場合に正の無限大方向へ丸めるため、Math.round(-1.5)は-1を返します。
parseInt()で小数文字列を解析する
ソースが文字列なら、parseInt()で整数部分を解析できます。10進数の文字列には基数として10を渡します。
console.log(parseInt("12.75", 10));
console.log(Number.isNaN(parseInt("not a number", 10)));
出力:
12
true
parseInt()は解析用の関数で、基数に対して無効な文字に達すると停止します。そのため既存の数値の切り捨てとは異なります。入力全体を数値へ変換して検証するなら、たとえばMath.trunc(Number("12.75"))が適切です。無効な入力があり得る場合はNumber.isNaN()などで検証します。
一般的な変換でtoFixed()とビット演算の短縮形を避ける
Number.toFixed()は書式設定用のメソッドです。指定した小数点以下の桁数に丸めて文字列を返すため、一般的な整数変換には使いません。
console.log(typeof (12.75).toFixed(0));
出力:
string
value | 0、~~value、value >> 0などのビット演算も0方向へ切り捨てますが、先に符号付き32ビット整数へ変換します。範囲外の値は桁あふれして循環することがあります。
console.log(2 ** 31 | 0);
出力:
-2147483648
これらは符号付きInt32への変換を意図している場合だけ使ってください。Math.trunc()より安全または明快な代替ではありません。
注意すべき制限
NumberはIEEE 754倍精度浮動小数点形式を使います。整数を正確に表せるのはNumber.MAX_SAFE_INTEGERからNumber.MIN_SAFE_INTEGERまでです。正確な整数演算が必要ならNumber.isSafeInteger()を使い、有限でない値も明示的に処理します。
console.log(Math.trunc(Infinity));
console.log(Math.trunc(NaN));
出力:
Infinity
NaN
Math.trunc()はInfinity、-Infinity、NaNを有限の整数にはしません。有限で安全な整数が必要なら入力を検証してください。
まとめ
既存のJavaScript数値で小数部分を0方向へ除いた値を「整数」とするなら、まずMath.trunc(value)を使います。特定の丸め規則にはMath.floor()、Math.ceil()、Math.round()を選びます。小数文字列にはparseInt(text, 10)を使い、toFixed()は書式付き文字列を返すこと、ビット演算は符号付き32ビット変換を意図する場合だけ使うことを覚えておきましょう。