Considere un fragmento de código simple:
let a = 0.1; let b = 0.2; let c = 0.3; let d = a + b; console.log(c.toString()); //0.3 console.log(d.toString()); //0.30000000000000004 La explicación que pude encontrar fue que 0.3 no se puede representar exactamente en un número de coma flotante de doble precisión. Pero si eso es cierto, ¿cómo puede c mantener el valor 0.3 sin perder precisión en caso de asignación directa ?
Ninguno de los dos puede representarse con precisión. Utilice este convertidor para ver lo que está pasando.
Los números de JavaScript se representan como números de 64 bits de doble precisión (IEEE754)
0.3 solo se interpreta como 0x3FD3333333333333 , que es, si calcula a mano:
.299999999999999988897769753748... Cuando se muestra como un decimal, se redondea a 0,3. No es que el valor almacenado sea exactamente igual a 0,3 (que se puede mostrar si intenta hacer más cálculos con él), sino que, cuando se muestra, se muestra como 0,3: está más cerca de 3 que del siguiente bit, que está en 2.9999999999999993 .
0.1 + 0.2 está un poco equivocado: el último dígito (en hexadecimal) es 4, no 3 . 0x3FD3333333333334 es:
.300000000000000044408920985006...De manera similar, no puede usar 0.300000000000000002 con asignación directa o registro directo, porque eso está entre los dos bits, y el intérprete debe elegir uno u otro:
console.log(0.30000000000000002);