web-dev-qa-db-ja.com

なぜNumber.MAX_SAFE_INTEGER 9,007,199,254,740,991であり、9,007,199,254,740,992ではないのですか?

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)です。

ECMAScript言語仕様

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になるのはなぜですか?

44
James Donnelly

Math.pow(2, 53)は直接表現できる最大の整数ですが、そのnsafeは、表現する最初の値も別の値の近似値でもあるためです。

_9007199254740992 == 9007199254740993 // true_

Math.pow(2, 53) - 1とは対照的に:

_9007199254740991 == 9007199254740993 // false_

34
Alex K.

次の数と比較したときに別の数に近接している唯一の数はtrueを示します

9007199254740992 == 9007199254740993
true
9007199254740993 == 9007199254740994
false
9007199254740991 == 9007199254740992
false
9007199254740997 == 9007199254740998
false
1
Merita Wilson H