Warum ist Number.MAX_SAFE_INTEGER 9.007.199.254.740.991 und nicht 9.007.199.254.740.992?
ECMAScript 6'sNumber.MAX_SAFE_INTEGER
stellt angeblich den maximalen numerischen Wert dar, den JavaScript speichern kann, bevor Probleme mit der Gleitkommapräzision auftreten. Voraussetzung ist jedoch, dass die zu diesem Wert hinzugefügte Zahl 1 auch als @ darstellbar isNumber
.
Number.MAX_SAFE_INTEGER
HINWEIS Der Wert vonNumber.MAX_SAFE_INTEGER
ist die größte Ganzzahln
so dassn
undn + 1
sind beide genau darstellbar alsNumber
Wert
Der Wert vonNumber.MAX_SAFE_INTEGER
ist9007199254740991 (2^53−1)
.
– ECMAScript Sprachspezifikation
Die JavaScript-Konsolen von Chrome, Firefox, Opera und IE11 können alle sicher Berechnungen mit der Nummer 9.007.199.254.740.992 durchführen. Einige Tests:
// 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
Warum ist es eine Voraussetzung, dassn + 1
muss auch als @ darstellbar seNumber
? Warum wird bei einem Fehlschlagen der Wertunsiche?