const a = 10; const b = 0.123456789123456789; console.log((a + b).toFixed(17)); // 10.12345678912345726 Como puede ver en el ejemplo anterior, .12345678912345 , solo esta parte se muestra correctamente, según entiendo, Javascript solo considera 15 lugares de precisión (incluido . ). Si cambiaré 10 a 100, será la misma cantidad, pero estaba pensando que debería tener una precisión de 17 lugares según el documento de MDN. ¿Qué no significa exactamente esta frase 17 decimal places of precision ?
Si lo muestro sin el método .toFixed() , mostrará la misma precisión 15 10.123456789123457 - respuesta de a + b
URL: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number
De acuerdo con la especificación JS/ECMAScript , el Number type utiliza un punto flotante de precisión doble que tiene un formato 64-bit ( binary64 ), consta de un bit de signo (determina el valor positivo o negativo), 11 bits de exponente y 52 bits de fracción (cada dígito representa 4 bits, por lo tanto, 64 bits tiene 16 dí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 punto 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 números pares se puede representar correctamente porque los bits de exponente afectarán al LSB (bit menos significativo) en 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 52 bits fraccionarios ( 72 bits 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 68 bits fraccionarios, por lo tanto, el último cero se corta para mantener una longitud de 64 bits.
Por lo general, las representaciones numéricas mayores que 9007199254740992 o menores que 1.1102230246251565E-16 se 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: