2012-03-10 20 views
54

Me preguntaba si JavaScript está manejando mal los enteros de 64 bits o estoy haciendo algo mal?JavaScript no puede manejar enteros de 64 bits, ¿o sí?

Tengo el siguiente código:

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

puedo obtener este valor: "4611686018427388000", que es 0x4000000000000060

+0

Relacionado: [¿Cuál es el Max Int de JavaScript? ¿Cuál es el valor entero más alto al que puede llegar un número sin perder precisión?] (Http://stackoverflow.com/questions/307179) – hippietrail

Respuesta

61

JavaScript representa números usando IEEE-754 formato de doble precisión (64 bits). Según tengo entendido, esto le da una precisión de 53 bits, o de quince a dieciséis dígitos decimales. Su número tiene más dígitos de los que JavaScript puede manejar, por lo que termina con una aproximación.

Esto no es realmente "mal manejo" como tal, pero obviamente no es muy útil si necesita precisión total en números grandes. Hay algunas bibliotecas JS alrededor que pueden manejar números más grandes, por ejemplo, BigNumber y Int64.

+1

Creo que estaba editando una solución en mi respuesta mientras escribía su comentario: puede usar un biblioteca que lo manejará por ti. (Nunca tuve que manejar números tan grandes en JS excepto para uso ocasional como ID de registro, en cuyo caso no tuve que hacer operaciones de matemáticas en ellos, así que mantenerlos como cadenas funcionó bien). – nnnnnn

+2

Cierre de goog.math.Long también puede ser útil: http://docs.closure-library.googlecode.com/git/class_goog_math_Long.html –

+20

. Tal vez debería agregarse que las operaciones a nivel de bits están limitadas a 32 bits IIUC. – sellibitze

Cuestiones relacionadas