const a = 10;
const b = 0.123456789123456789;
console.log((a + b).toFixed(17));
// 10.12345678912345726Solución del problema
De acuerdo con la JS/ECMAScriptespecificación, Number typeutiliza un punto flotante de doble precisión que tiene 64-bitformato ( binary64), consta de un bit de signo (determina un valor positivo o negativo), bits de 11exponente y bits de 52fracción (cada dígito representa 4-bits, por lo tanto, -bit 64tiene 16dígitos):
El tipo de número que representa los valores IEEE 754-2008 de formato de 64 bits de doble precisión, tal como se especifica en el estándar IEEE para la aritmética binaria de coma flotante.
El número positivo máximo que se puede representar correctamente usando doble precisión es 9007199254740992, que se puede lograr usando Math.pow(2, 53). Si el rango de números está entre Math.pow(2, 53)y Math.pow(2, 54)(o entre Math.pow(2, -53)y Math.pow(2, -54)), solo los números pares se pueden representar correctamente porque los bits de exponente afectarán LSB(bit menos significativo) a los bits de fracción.
Repasemos la parte de los números grandes:
var x = 12345678912345.6789
var x = new Number(12345678912345.6789)
Este número contiene más de 52bits fraccionarios ( 72bits en total), de ahí el redondeo utilizado para mantener los bits fraccionarios a 52.
También con este número decimal:
var x = new Number(.12345678912367890)
Este número contiene 68bits fraccionarios, por lo tanto, el último cero se corta para mantener la 64longitud de bits.
Por lo general, las representaciones numéricas mayores 9007199254740992o menores que 1.1102230246251565E-16se almacenan como cadenas literales en lugar de Number. Si necesita calcular números muy grandes, hay ciertas bibliotecas externas disponibles para realizar aritmética de precisión arbitraria.
Si desea emitir más de 16 puntos después del punto decimal, puede:
- Use una cadena literal para representar su número
- Use bibliotecas externas como math.js, BigInteger.js o la biblioteca strint.
No hay comentarios:
Publicar un comentario