Warum ist die Zahl.MAX_SAFE_INTEGER 9,007,199,254,740,991 und nicht 9,007,199,254,740,992?
ECMAScript 6 ist Number.MAX_SAFE_INTEGER
angeblich repräsentiert der numerische Höchstwert, den JavaScript speichern kann, bevor Sie Probleme mit floating-point-Präzision. Aber es ist eine Anforderung, dass die Zahl 1 addiert zu diesem Wert muss auch darstellbar als Number
.
Number.MAX_SAFE_INTEGER
HINWEIS: Der Wert von
Number.MAX_SAFE_INTEGER
ist die größte ganze Zahln
so dassn
undn + 1
sind beide genau darstellbar alsNumber
Wert.Den Wert
Number.MAX_SAFE_INTEGER
ist9007199254740991 (2^53−1)
.
Den JavaScript-Konsolen von Chrome, Firefox, Opera und IE11 können alle sicher zu führen Sie die Berechnungen mit der Anzahl 9,007,199,254,740,992. 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, dass n + 1
muss auch darstellbar als Number
? Warum nicht dieses, dass der Wert unsicher?
- Vielleicht, weil
2^53 - 1
ist der Letzte Wert, der genau dargestellt -2^53
geben den gleichen Wert wie2^53 + 1
("Geklaut" von leanpub.com/understandinges6/read#leanpub-auto-numbers) - Die Nummern beginnen ab
0
.. vielleicht ist das der Grund.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde sagen Ihrer weil während
Math.pow(2, 53)
ist der größte direkt Darstellbare ganze Zahl, ist seine unsicher, dass Ihr auch den ersten Wert, der mit der Repräsentation ist auch eine Annäherung von einem anderen Wert:9007199254740992 == 9007199254740993 //true
Im Gegensatz zu
Math.pow(2, 53) - 1
:9007199254740991 == 9007199254740993 //false
99007199254740992
unsicher ist, die vom proxy, und nicht unbedingt eine unsichere Zahl, wenn Sie wissen, dass das ist definitiv der Wert, den Sie wollen, sind zu verwenden.die einzige Zahl, die in der Nähe eines anderen
verglichen mit seinen nächsten Zahl zeigt wahre
2^53 + 4
und2^53 + 5
, Sie finden Sie gleich im IEEE754-double-precision.