2011-01-30 17 views
5

Il codice seguenteJavaScript integer overflow

console.log(Math.pow(2, 53)); 
console.log(Math.pow(2, 53) + 1); 

produce esattamente stessa uscita per entrambi i calcoli:

9007199254740992 

Perché?

+0

Possibile duplicato: http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest-integer-value-a-number-can-go-to –

risposta

10

Il risultato visualizzato è dovuto al fatto che Math.Pow() funziona con numeri in virgola mobile e quando si raggiunge la 16a cifra decimale, non è possibile aggiungerne uno alla cifra decimale meno significativa del valore e attendere che il risultato cambi.

Ci sono in genere, in un valore binario a virgola mobile a 64 bit (8 byte) IEEE 754, 53 bit per la mantissa (incluso l'1 bit implicito). Il calcolo Math.Pow(2, 53) richiede 54 bit nella mantissa per garantire una modifica. Se aggiungi 2, dovresti vedere la modifica.

-3

Tutti i numeri Javascript sono doppi.

+0

No. Tutti i numeri in JavaScript sono numeri a virgola mobile a 64 bit. – simeg