ECMAScript 6の_Number.MAX_SAFE_INTEGER
_は、浮動小数点の精度で問題が発生する前にJavaScriptが保存できる最大数値を表していると考えられます。ただし、この値に追加される数値1もNumber
として表現できる必要があります。
_
Number.MAX_SAFE_INTEGER
_注_
Number.MAX_SAFE_INTEGER
_の値は、n
と_n + 1
_の両方がn
値として正確に表現できるような最大の整数Number
です。_
Number.MAX_SAFE_INTEGER
_の値は9007199254740991 (2^53−1)
です。
Chrome、Firefox、OperaおよびIE11のJavaScriptコンソールはすべて、9,007,199,254,740,992という数値で安全に計算を実行できます。いくつかのテスト:
_// Valid
Math.pow(2, 53) // 9007199254740992
9007199254740991 + 1 // 9007199254740992
9007199254740992 - 1 // 9007199254740991
9007199254740992 / 2 // 4503599627370496
4503599627370496 * 2 // 9007199254740992
parseInt('20000000000000', 16) // 9007199254740992
parseInt('80000000000', 32) // 9007199254740992
9007199254740992 - 9007199254740992 // 0
9007199254740992 == 9007199254740991 // false
9007199254740992 == 9007199254740992 // true
// Erroneous
9007199254740992 + 1 // 9007199254740992
9007199254740993 + "" // "9007199254740992"
9007199254740992 == 9007199254740993 // true
_
_n + 1
_もNumber
として表現できる必要があるのはなぜですか?これに失敗すると、値unsafeになるのはなぜですか?
Math.pow(2, 53)
は直接表現できる最大の整数ですが、そのnsafeは、表現する最初の値も別の値の近似値でもあるためです。
_9007199254740992 == 9007199254740993 // true
_
Math.pow(2, 53) - 1
とは対照的に:
_9007199254740991 == 9007199254740993 // false
_
次の数と比較したときに別の数に近接している唯一の数はtrueを示します
9007199254740992 == 9007199254740993
true
9007199254740993 == 9007199254740994
false
9007199254740991 == 9007199254740992
false
9007199254740997 == 9007199254740998
false