Le Number.MAX_SAFE_INTEGER
d'ECMAScript 6 représente supposément la valeur numérique maximale que JavaScript peut stocker avant que des problèmes de précision en virgule flottante ne surviennent. Cependant, il faut que le nombre 1 ajouté à cette valeur soit également représentable sous la forme Number
.
Number.MAX_SAFE_INTEGER
NOTE La valeur de
Number.MAX_SAFE_INTEGER
est le plus grand entiern
tel quen
etn + 1
soient tous deux parfaitement représentables sous la forme d'une valeurNumber
.La valeur de
Number.MAX_SAFE_INTEGER
est9007199254740991 (2^53−1)
.
Les consoles JavaScript de Chrome, Firefox, Opera et IE11 peuvent toutes effectuer des calculs en toute sécurité avec le numéro 9 007 199 254 740 992. Quelques 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
Pourquoi est-il nécessaire que n + 1
soit également représentable en tant que Number
? Pourquoi échouer à cela rend-il la valeur unsafe?
Je dirais que c'est parce que si Math.pow(2, 53)
est le plus grand entier directement représentable, son unsafe dans le fait que c'est aussi la première valeur qui est la représentation qui est aussi une approximation d'une autre valeur:
9007199254740992 == 9007199254740993 // true
Contrairement à Math.pow(2, 53) - 1
:
9007199254740991 == 9007199254740993 // false
le seul numéro qui se trouve à proximité immédiate d'un autre par rapport au nombre suivant, indique true 9007199254740992 == 9007199254740993 true 9007199254740993 == 9007199254740994 =__. false 9007199254740997 == 9007199254740998 false