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ビット変換を意図する場合だけ使うことを覚えておきましょう。