Number型

プログラミングで数値を扱うときは、その言語における数値の扱いに注意する必要があります。ここでは、JavaScriptで数字に関して注意するべき、いくつかの重要な点を説明します。

コアな型

JavaScriptにはたった1つの数値型しかありません。倍精度の64ビットの数値(Number)です。以下でその限界値と望ましい解決策について説明します。

10進数(Decimal)

他の言語におけるdouble / floatに精通している人であれば、バイナリの浮動小数は10進数の小数と正しく対応していないことを知っているでしょう。 JavaScriptの数値を使った簡単な(そして有名な)例を以下に示します:

console.log(.1 + .2); // 0.30000000000000004

正しい小数演算のためには、以下に述べるbig.jsを使います。

整数(Integer)

整数値の限界は、組み込みの数値型Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGERによって決まります。

console.log({max: Number.MAX_SAFE_INTEGER, min: Number.MIN_SAFE_INTEGER});
// {max: 9007199254740991, min: -9007199254740991}

数値の扱いにおける安全とは、丸め誤差が起きた数値ではないことが確実であることです。

安全でない値は、安全な限界値から+1 か -1離れた値であり、どんな値の加算/減算でも、結果を丸めるでしょう。

console.log(Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2); // true!
console.log(Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER - 2); // true!

console.log(Number.MAX_SAFE_INTEGER);      // 9007199254740991
console.log(Number.MAX_SAFE_INTEGER + 1);  // 9007199254740992 - Correct
console.log(Number.MAX_SAFE_INTEGER + 2);  // 9007199254740992 - Rounded!
console.log(Number.MAX_SAFE_INTEGER + 3);  // 9007199254740994 - Rounded - correct by luck
console.log(Number.MAX_SAFE_INTEGER + 4);  // 9007199254740996 - Rounded!

安全性をチェックするには、ES6のNumber.isSafeIntegerを使用します:

JavaScriptは、最終的にBigInt がサポートされます。現時点では、任意精度整数の計算を行いたい場合は、下記のbig.jsを使います。

big.js

財務計算(例:GST計算、セントでのお金、追加など)のために数学を使用する場合は、big.jsのようなライブラリを使用します。

  • 完全無欠な10進演算

  • 安全な範囲外の整数値

インストールは簡単です:

簡単な使用例:

このライブラリは、チャートやキャンバスの描画など、UI /パフォーマンスが重視される目的には使用しないでください。

NaN

数値計算が有効な数値で表現できない場合、JavaScriptは特別なNaN値を返します。古典的な例は虚数です。

注:等価演算子はNaN値では機能しません。代わりにNumber.isNaNを使用してください:

無限(Infinity)

Numberで表現可能な値の境界は、Number.MAX_VALUE-Number.MAX_VALUEの値として利用できます。

精度が変更されない範囲外の値は、これらの限界値に制限されます。

精度が変更される範囲外の値は、特殊な値Infinity/-Infinityに解決されます。

もちろん、これらの無限大値は、それを必要とする算術演算でも現れます。

以下のように、これらのInfinity値を手動で使うか、Numberクラスの静的メンバを使うことができます:

幸運なことに、比較演算子(</ >)は無限値に対して確実に正しく動作します:

無限小(Infinitesimal)

Numberで表現可能なゼロでない最小値は、静的なNumber.MIN_VALUEとして使用できます。

MIN_VALUEより小さい値(アンダーフロー値)は0に変換されます。

より直感的に: Number.MAX_VALUEより大きい値がINFINITYに丸められるように、Number.MIN_VALUEより小さい値は0に丸められます。

最終更新

役に立ちましたか?