2012-11-17 16 views
27

Qualcuno può spiegarmi perché 9999999999999999 viene convertito in 10000000000000000?Perché 9999999999999999 viene convertito in 10000000000000000 in JavaScript?

alert(9999999999999999); //10000000000000000 

http://jsfiddle.net/Y2Vb2/

+2

Tale numero è troppo grande per essere un numero intero, quindi viene eventualmente convertito in un letto. I numeri in virgola mobile non sono esatti. –

+1

come @Kos ha detto che tutti i numeri javascript sono numeri in virgola mobile a precisione doppia, il che significa che hai solo 16 cifre di precisione e '9999999999999999' passa chiaramente tale limite – Ravi

+6

Correlati: Il numero intero più alto che può essere utilizzato con precisione al 100% in javascript è ** +/- 9007199254740992 ** (o 'Math.pow (2,53)'): http://stackoverflow.com/questions/307179/what-is-javascripts-max-int-whats-the-highest- numero intero-un-numero-can-go-t – David

risposta

9

9999999999999999 viene trattato internamente in JavaScript come numero in virgola mobile. Non può essere rappresentato con precisione in IEEE 754 a doppia precisione in quanto richiederebbe 54 bit di precisione (il numero di bit è log2 (9999999999999999) = 53,150849512 ... e poiché i bit frazionari non esistono, il risultato deve essere ridotto) mentre IEEE 754 fornisce solo 53 bit (1 bit implicito + 52 bit della mantissa esplicitamente memorizzati) - un po 'meno. Quindi il numero viene semplicemente arrotondato.

Poiché in questo caso viene perso solo un bit, anche i numeri a 54 bit sono esattamente rappresentabili, poiché contengono comunque 0 nel bit, che viene perso. I numeri dispari a 54 bit sono arrotondati al valore più vicino che corrisponde a un numero pari a 53 bit assegnato alla modalità di arrotondamento obiettivo predefinita di IEEE 754.

+3

I numeri dispari non vengono sempre arrotondati per eccesso. La pratica abituale consiste nell'utilizzare l'arrotondamento del banchiere, in modo da arrotondare al multiplo più vicino di quattro. Un rapido test nella console di Google Chrome lo conferma. –

+0

Sono stato corretto. –

+0

IEEE ha diverse modalità di arrotondamento, ma per impostazione predefinita (che è ciò che viene utilizzato da JS) arrotonda i casi a metà strada verso il numero binario pari più vicino. In alcune circostanze questo è un multiplo di quattro, ma non sempre. –

3

Domanda: A volte i calcoli JavaScript sembrano produrre risultati "imprecisi", ad es. 0,362 * 100 rese 36,199999999999996. Come posso evitare questo?

Risposta: Internamente JavaScript memorizza tutti i numeri in formato a virgola mobile a precisione doppia, con una mantissa a 52 bit e un esponente a 11 bit (lo standard IEEE 754 per la memorizzazione di valori numerici). Questa rappresentazione interna dei numeri può causare risultati imprevisti come sopra. La maggior parte degli interi superiori a 253 = 9007199254740992 non può essere rappresentata esattamente in questo formato. Allo stesso modo, molti decimali/frazioni, come 0.362, non possono essere rappresentati esattamente, portando alla "imprecisione" percepita nell'esempio sopra. Per evitare questi risultati "inaccurati", potresti voler arrotondare i risultati alla precisione dei dati che hai usato.

http://www.javascripter.net/faq/accuracy.htm

Problemi correlati