JavaScript 整数の上限と精度
JavaScriptにおける整数の上限値について
JavaScriptにおける整数の上限値は、数値の表現方法やブラウザの実装によって異なる可能性がありますが、一般的に、53ビット符号付き整数の範囲である -9007199254740991 から 9007199254740991 (2^53 - 1) までが正確に表現できる整数値です。
これを超える整数値を扱う場合は、精度が失われる可能性があります。例えば、大きな整数同士の加算や減算を行うと、誤差が生じることがあります。
理由
- したがって、整数部分を53ビットを超える値を表現しようとすると、精度が失われます。
- この表現形式では、整数部分を53ビットで表現し、残りの11ビットで小数部分を表現します。
- JavaScriptの内部では、数値は64ビット浮動小数点数として表現されています。
対策
- 計算結果の精度が重要でない場合は、数値を整数型にキャストして、精度を落とすことができます。
- 大きな整数を扱う必要がある場合は、BigInt型を使用することができます。BigInt型は任意の大きさの整数を表現できるため、精度が失われる心配はありません。
例
// 正確な整数値
console.log(2 ** 53 - 1); // 9007199254740991
// 精度が失われる整数値
console.log(2 ** 53); // 9007199254740992
// BigInt型を使用
console.log(BigInt(2 ** 53)); // 9007199254740992n
注意
- JavaScriptの仕様は常に進化しているため、将来のバージョンでは制限が緩和される可能性があります。
- ブラウザによっては、これらの制限が異なる場合があります。
整数の上限の例
// 正確な整数値
console.log(2 ** 53 - 1); // 9007199254740991
// 精度が失われる整数値
console.log(2 ** 53); // 9007199254740992
2 ** 53
: 2の53乗は、JavaScriptで表現できる整数値の範囲を超えているため、精度が失われます。2 ** 53 - 1
: 2の53乗から1を引いた値は、JavaScriptで正確に表現できる最大の整数値です。
BigInt型を使用した例
// BigInt型を使用
console.log(BigInt(2 ** 53)); // 9007199254740992n
BigInt(2 ** 53)
:BigInt
型を使用して、任意の大きさの整数を表現することができます。この例では、2の53乗を正確に表現しています。
精度が失われる例
// 精度が失われる計算
let x = 0.1 + 0.2;
console.log(x); // 0.30000000000000004
- 浮動小数点数の計算: 浮動小数点数の計算では、精度が失われることがあります。この例では、0.1と0.2の和が正確に0.3にならないのは、浮動小数点数の表現によるものです。
精度を維持する例
// 精度を維持する計算
let x = 0.1 * 10 + 0.2 * 10;
console.log(x / 10); // 0.3
- 整数化による精度維持: 浮動小数点数を整数化してから計算し、最後に元のスケールに戻すことで、精度を維持することができます。
- 使用例
let largeNumber = BigInt(9007199254740991) + BigInt(1); console.log(largeNumber); // 9007199254740992n
- 任意の大きさの整数
BigInt型は任意の大きさの整数を表現できるため、JavaScriptのデフォルトの整数型では表現できない大きな整数も扱うことができます。
浮動小数点数を整数化して計算する
- 使用例
let result = (0.1 * 10 + 0.2 * 10) / 10; console.log(result); // 0.3
ライブラリを使用する
- サードパーティライブラリ
いくつかのサードパーティライブラリは、任意精度の整数や浮動小数点数をサポートしています。これらのライブラリを使用することで、JavaScriptのデフォルトの整数型では表現できない大きな数値を扱うことができます。
計算方法を工夫する
- 計算順序を考慮する
計算順序によっては、精度が影響を受けることがあります。適切な計算順序を選択することで、精度を維持することができます。 - 整数演算を優先する
可能な限り整数演算を使用し、浮動小数点数の演算を避けることで、精度を維持することができます。
javascript math browser