2012-03-10 12 views
54

Mi chiedevo se JavaScript non gestisce correttamente interi a 64 bit o sto facendo qualcosa di sbagliato?JavaScript non può gestire interi a 64 bit, vero?

Ho il codice seguente:

var str = "0x4000000000000000"; //4611686018427387904 decimal 
var val = parseInt(str); 
alert(val); 

ottengo questo valore: "4611686018427388000", che è 0x4000000000000060

+0

Correlato: [Cos'è Max Int di JavaScript? Qual è il valore intero più alto a cui un numero può andare senza perdere precisione?] (Http://stackoverflow.com/questions/307179) – hippietrail

risposta

61

JavaScript rappresenta numeri utilizzando IEEE-754 doppia precisione formato (64 bit). A quanto ho capito, questo ti dà una precisione di 53 bit o quindici o sedici cifre decimali. Il tuo numero ha più cifre di quante possano essere gestite da JavaScript, quindi ti ritrovi con un'approssimazione.

Questo non è proprio un "maltrattamento" in quanto tale, ma ovviamente non è molto utile se hai bisogno di precisione su grandi numeri. Esistono alcune librerie JS che possono gestire numeri più grandi, ad esempio BigNumber e Int64.

+1

Penso che stavo modificando una soluzione nella mia risposta mentre stavi scrivendo il tuo commento: puoi usare un libreria che lo gestirà per te. (Non ho mai avuto bisogno di gestire numeri così grandi in JS tranne che per l'uso occasionale come ID record, nel qual caso non avevo bisogno di fare operazioni matematiche su di loro, quindi tenerli come se le stringhe funzionassero bene.) – nnnnnn

+2

Chiusura goog.math.Long potrebbe anche essere utile: http://docs.closure-library.googlecode.com/git/class_goog_math_Long.html –

+20

Si dovrebbe forse aggiungere che le operazioni a livello di bit sono limitate a IIUC a 32 bit. – sellibitze

Problemi correlati