2013-11-26 17 views
6

Questo è uno strano problema che sto affrontando. Quando passo dei grandi numeri per le funzioni di JS (personalizzata o built-in) il valore viene automaticamente sempre incrementato di 1. Ad esempio, vedere questo:Problema con alcuni grandi numeri in Java Script

<!DOCTYPE html> 
<html> 
<body> 

<p>Click the button to display an alert box.</p> 

<button onclick="myFunction()">Try it</button> 

<script> 
function myFunction() 
{ 
alert(10466511635124471); 
} 
</script> 

</body> 
</html> 

nel avviso che sto vedendo 10466511635124472, invece di 10466511635124471 . Qualcuno può spiegare questo comportamento?

Ho controllato questo in FF 17.0.10 e Chrome 12.0.742.122 e IE 8.

+0

Vedi qui http: // floating-point gui.de/ – elclanrs

+0

fondamentalmente incrementa tutti i numeri dispari con un intervallo dato ... prova 10466511635124472 mostrerà valori corretti, quello che osservo. onestamente non so perché –

+0

@Arun: Non necessariamente, è fuorviante. –

risposta

1

Questo è a che fare con la natura del IEEE754 double-precision 64-bit floating point math (all compliant JavaScript implementations use this form of IEEE arithmetic) - il proprio numero di 10 466 511 635 124 471 è maggiore del numero intero positivo più alto rappresentabile come numeri consecutivi, ovvero 2 (9 007 199 254 740 992). I 64 bit di un numero in JavaScript sono rappresentati usando 1 bit per il segno, 52 bit per il numero (il comportamento speciale per gli esponenti fa effettivamente 53 bit di precisione) e 11 bit per l'esponente, che è il motivo per cui questo è il caso.

Quando il numero supera questo numero massimo, verrà utilizzato un esponente superiore a 1 per rappresentare ciò, il che si tradurrà nella riduzione della rappresentazione più piccola possibile. Con un esponente di due (come è rappresentato nel tuo caso), il più piccolo cambiamento differenziabile nei numeri sarà due, e poiché il tuo numero è tra questi due, sarà arrotondato al più vicino.

JavaScript non ha alcuna arbitraria-size formato intero, né ha il supporto per qualcosa di simile a BigNum (per usare il termine Java) o l'aritmetica precisione arbitraria. Se desideri memorizzare numeri più grandi, dovrai utilizzare un altro metodo per archiviarli, ad esempio le stringhe.

1:ho collegato a Wikipedia come specifica attuale non costano denaro per ottenere legalmente/ufficialmente - se qualcuno ha una fonte migliore si prega di modificarlo in

2

Javascript non ha alcuna. supporto per i grandi numeri interi. Usa il float a 64 bit per memorizzare il numero, la precisione, il segno e l'esponente.

Una buona pratica è quella di utilizzare rappresentazioni di stringa di questi numeri:

alert("10466511635124471"); 

Privacy questa risposta JSON da Facebook grafico api: Tutti i ragionevolmente numeri che sarebbero inferiori a 32 bit interi sono ancora interi, ma come gli utenti di Facebook a 64 bit interi come i suoi ids, sono stati convertiti in stringhe:

http://graph.facebook.com/cocacola

-1

numero positivo più grande consentito in Javascript è 1.79E + 308.

Hai preso un certo numero (10466511635124471), che è maggiore del larget + ve number.May essere questo è il motivo per ottenere la risposta come 10466511635124472.