¿JavaScript admite enteros de 64 bits?

81

Tengo el siguiente código:

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

Obtengo este valor: " 4611686018427388000", que es0x4000000000000060

Me preguntaba si JavaScript está manejando mal los enteros de 64 bits o si estoy haciendo algo mal.

ahmd0
fuente

Respuestas:

87

JavaScript representa números usando IEEE-754 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. Tu número tiene más dígitos de los que JavaScript puede soportar, por lo que terminas con una aproximación.

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

nnnnnn
fuente
2
Goog.math.Long de Closure también puede ser útil: docs.closure-library.googlecode.com/git/…
Jeremy Condit
38
Quizás se deba agregar que las operaciones a nivel de bits están limitadas a IIUC de 32 bits.
sellibitze
2
La documentación de goog.math.Long se ha movido: google.github.io/closure-library/api/class_goog_math_Long.html
benizi
5
(Comentario de @Michaelangelo ) Desafortunadamente, las Especificaciones de ECMAScript 2015 (versión 6) no tienen soporte oficial para UInt64; mientras que Mozilla ha agregado soporte para UInt64 , esto no es estándar. WebGL tiene necesidades similares, pero desafortunadamente Uint64Arraytampoco existe , solo Uint32Array .
falsarella
2
La documentación de goog.math.Long se ha movido de nuevo: google.github.io/closure-library/api/goog.math.Long.html (Gracias, @Pacerier)
benizi
10

La versión 57 de Chromium y posteriores admiten de forma nativa enteros de precisión arbitraria. Esto se llama BigInt y también se está trabajando en otros navegadores. Es dramáticamente más rápido que las implementaciones de JavaScript.

Shnatsel
fuente
También es compatible con Opera 54+ y Node.js. Firefox 65+ lo admite si la javascript.options.bigintbandera está habilitada.
David Callanan
No siempre es más rápido. compare esto con los console.time("go");for (var i=0;i<10000000;++i) {} console.timeEnd("go");números de 64 bitsconsole.time("go");for (var i=0n;i<10000000n;++i) {} console.timeEnd("go");
Cibo FATA8
@ CiboFATA8: Habla de BigInt como un componente de navegador nativo frente a BigInt implementado en JavaScript. Está comparando js Numbers, que son flotantes con aproximadamente 53 bits de precisión (no 64) con el navegador nativo BigInt (tampoco 64 bits).
hippietrail