web-dev-qa-db-fra.com

Pourquoi Number.MAX_SAFE_INTEGER est-il 9 007 199 254 740 991 et non 9 007 199 254 740 992?

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 entier n tel que n et n + 1 soient tous deux parfaitement représentables sous la forme d'une valeur Number.

La valeur de Number.MAX_SAFE_INTEGER est 9007199254740991 (2^53−1).

- Spécification du langage ECMAScript

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?

39
James Donnelly

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

31
Alex K.

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

0
Merita Wilson H