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.
javascript
numbers
integer
64-bit
ahmd0
fuente
fuente
Respuestas:
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 .
fuente
UInt64
; mientras que Mozilla ha agregado soporte para UInt64 , esto no es estándar. WebGL tiene necesidades similares, pero desafortunadamenteUint64Array
tampoco existe , solo Uint32Array .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.
fuente
javascript.options.bigint
bandera está habilitada.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");