JavaScript BigInt
JavaScript の BigInt 変数は、通常の JavaScript 数値では表現できない大きな整数値を格納するために使用されます。
目次
JavaScript 整数の精度
JavaScript の整数は最大で15桁まで正確です:
let x = 999999999999999;
let y = 9999999999999999;
JavaScript ではすべての数値が64ビット浮動小数点形式(IEEE 754 標準)で保存されます。
この標準により、大きな整数は正確に表現できず、四捨五入されます。
そのため、JavaScript は以下の範囲の整数を安全に表現できます:
- 9007199254740991(253-1)までの正の整数
- -9007199254740991(-253-1)までの負の整数
この範囲外の整数値は精度が失われます。
BigInt の作成方法
BigInt を作成するには、整数の末尾に n を追加するか、BigInt() を呼び出します:
例
let x = 9999999999999999;
let y = 9999999999999999n;
let a = 1234567890123456789012345n;
let b = BigInt(1234567890123456789012345);
BigInt: 新しい JavaScript データ型
JavaScript での BigInt の typeof は “bigint” です:
例
let x = BigInt(999999999999999);
let type = typeof x;
BigInt は JavaScript で数値データ型の2番目(Number の後)です。
BigInt を使うことで、JavaScript でサポートされるデータ型の合計数は8つになります:
- String
- Number
- Bigint
- Boolean
- Undefined
- Null
- Symbol
- Object
BigInt 演算子
JavaScript の Number で使用できる演算子はすべて BigInt でも使用できます。
BigInt 乗算の例
let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;
注意: BigInt と Number の間の算術演算は許可されていません(型変換が情報を失います)。
符号なし右シフト(>>>) は BigInt ではできません(固定幅を持たないため)。
BigInt の小数点
BigInt には小数点がありません。
BigInt 除算の例
let x = 5n;
let y = x / 2;
// エラー: BigInt と他の型を混在させることはできません。明示的な変換を使用してください。
let x = 5n;
let y = Number(x) / 2;
BigInt の16進数、8進数、2進数
BigInt は16進数、8進数、または2進数表記で書くこともできます:
BigInt 16進数の例
let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;
精度の興味深い点
四捨五入はプログラムのセキュリティを危険にさらすことがあります:
MAX_SAFE_INTEGER の例
9007199254740992 === 9007199254740993; // true !!!
ブラウザのサポート
BigInt は2020年9月以降、すべてのブラウザでサポートされています:
- Chrome 67
- Edge 79
- Firefox 68
- Safari 14
- Opera 54
(ブラウザのバージョンの始まりは異なります)
最小および最大の安全整数
ES6 では、Number オブジェクトに max および min プロパティが追加されました:
MAX_SAFE_INTEGER の例
let x = Number.MAX_SAFE_INTEGER;
MIN_SAFE_INTEGER の例
let x = Number.MIN_SAFE_INTEGER;
新しい数値メソッド
ES6 では、Number オブジェクトに 2つの新しいメソッドが追加されました:
The Number.isInteger() メソッド
Number.isInteger() メソッドは、引数が整数であれば true を返します。
Example: isInteger()
Number.isInteger(10);
Number.isInteger(10.5);
The Number.isSafeInteger() メソッド
安全な整数は、倍精度数値として正確に表現できる整数です。
Number.isSafeInteger() メソッドは、引数が安全な整数であれば true を返します。
Example: isSafeInteger()
Number.isSafeInteger(10);
Number.isSafeInteger(12345678901234567890);
安全な整数は、-(253 – 1) から +(253 – 1) までのすべての整数です。