JavaScriptで5000兆円は扱えるが9007199254740991円を超えるとバグになる

JavaScriptにおける整数値の上限

JavaScriptでは扱える整数値に上限が存在する。

扱える整数値の上限を取得するにはNumber.MAX_SAFE_INTEGERを使用する。

console.log(Number.MAX_SAFE_INTEGER)
// 9007199254740991

Number.MAX_SAFE_INTEGERを大きく超えた数値を扱うと数値が丸められてしまう。

例えば5008兆1円の場合は5008000000000001と表示されるが、9008兆1円の場合は9008000000000000円と表示される。

const num1 = 5008000000000001
const num2 = 9008000000000001

console.log(num1)
// 5008000000000001

console.log(num2)
// 9008000000000000

整数値の上限を超える場合の対策

9008兆1円のようなNumber.MAX_SAFE_INTEGERを超える場合でも正しく表示させたい場合は文字列を使用することで解決できる。

const num = '9008000000000001'

console.log(num)
// '9008000000000001'

文字列だと四則演算で計算しようとしても結果は文字列になってしまうので注意。

const num = '9008000000000001' + 10

console.log(num)
// '900800000000000110'

将来的にはBigIntを使用する

将来的にはBigIntを使用すればNumber.MAX_SAFE_INTEGERを超える数値でも扱えるようになる。

ただし、現在は対応しているブラウザが少ないため使用は避けたほうがほうが良いだろう。

末尾に「n」が付いているのは間違えではなく、BigIntの仕様です。

const num = BigInt(9008000000000001n)
 
console.log(num)
// 9008000000000001n