1117 votes

Qu'est-ce que JavaScript Max Int? Quelle est la plus grande valeur entière d'un Nombre peut aller sans perdre de précision?

Est-ce défini par la langue? Est-il un maximum défini? Est-elle différente dans les différents navigateurs?

1000voto

Jimmy Points 35501

+/- 9007199254740992

ECMA Section 8.5 - les Numéros

Notez que tous les entiers positifs et négatifs dont l'ampleur n'est pas supérieure à 253 sont représentable dans le type de Numéro (en effet, le nombre entier de 0 a deux représentations, +0 et -0).

Ils sont 64 bits des valeurs à virgule flottante, la plus exacte de l'intégrale est égale à 253, ou 9007199254740992.

Notez que les opérateurs au niveau du bit et d'opérateurs de décalage de fonctionner sur 32 bits entiers.


Faites le Test!

var x = 9007199254740992;
var y = -x;
x == x + 1; // true !
y == y - 1; // also true !
// Arithmetic operators work, but bitwise/shifts only operate on int32:
x / 2;      // 4503599627370496
x >> 1;     // 0
x | 1;      // 1

503voto

Peter Bailey Points 62125

À partir de la référence:

alert([Number.MAX_VALUE, Number.MIN_VALUE]);

120voto

Vjeux Points 2047

Il est 2^53 == 9 007 199 254 740 992. C'est parce que les Nombres sont stockés en tant que point flottant dans un 52 bits de mantisse.

La valeur min est de -2^53.

http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html

Cela rend certaines choses amusantes qui se passe

Math.pow(2, 53) == Math.pow(2, 53) + 1
>> true

Et peut être dangereux :)

var MAX_INT = Math.pow(2, 53); // 9 007 199 254 740 992
for (var i = MAX_INT; i < MAX_INT + 2; ++i) {
  // infinite loop
}

66voto

BananaNeil Points 1351

En javascript, il y a un nombre appelé l'Infini

exemples:

(Infinity>100)
=> true

//also worth noting
Infinity - 1 == Infinity
=> true

Math.pow(2,1024) === Infinity
=> true

Cela peut être suffisant pour certaines questions à ce sujet.

41voto

Briguy37 Points 4748

Jimmy répondre correctement représente l'continue JavaScript entier spectre -9007199254740992 de 9007199254740992 compris (désolé 9007199254740993, vous pensez que vous êtes 9007199254740993, mais vous avez tort!).

Cependant, il n'y a pas de réponse qui trouve/le prouve par programmation (autre que celui CoolAJ86 fait allusion dans sa réponse qui aurait fini dans 28.56 ans ;), voici donc un peu moyen beaucoup plus efficace de le faire (pour être précis, il est plus efficace d'environ 28.559999999968312 ans :), avec un test de violon:

/**
 * Checks if adding/subtracting one to/from a number yields the correct result.
 *
 * @param number The number to test
 * @return true if you can add/subtract 1, false otherwise.
 */
var canAddSubtractOneFromNumber = function(number){
    var numMinusOne = number - 1;
    var numPlusOne = number + 1;

    return ((number - numMinusOne) == 1) && ((number - numPlusOne) == -1);
}

//Find the highest number
var highestNumber = 3;//Start with an integer 1 or higher

//Get a number higher than the valid integer range
while(canAddSubtractOneFromNumber(highestNumber)){
    highestNumber *= 2;
}

//Find the lowest number you can't add/subtract 1 from
var numToSubtract = highestNumber / 4;
while(numToSubtract >= 1){
    while(!canAddSubtractOneFromNumber(highestNumber - numToSubtract)){
        highestNumber = highestNumber - numToSubtract;
    }

    numToSubtract /= 2;
}        

//And there was much rejoicing.  Yay.    
console.log('HighestNumber = ' + highestNumber);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X