La pregunta planteada nos pide que predigamos el resultado de la expresión console.log(0.1 + 0.2 === 0.3)
. Si bien uno podría pensar que el resultado sería true
, en JavaScript, esto realmente devuelve false
. ¿Pero por qué ocurre esto?
En JavaScript, todos los números son almacenados como números de punto flotante de 64 bits, también conocidos como "dobles" en lenguajes como C o Java. Esta precisión es suficiente para la mayoría de los usos, pero puede crear problemas inesperados con decimales.
El estándar que JavaScript sigue para los números de punto flotante de 64 bits se llama IEEE-754. Según este estándar, los números de punto flotante se almacenan en una representación binaria, no decimal, lo que significa que algunos números decimales no pueden representarse con exactitud.
Cuando sumamos 0.1
y 0.2
en JavaScript, el resultado no es exactamente 0.3
debido a estos problemas de precisión.
Para ayudarte a visualizar este concepto, prueba a escribir la siguiente línea de código en tu consola de JavaScript:
console.log(0.1 + 0.2);
Verás que el resultado es 0.30000000000000004
, no 0.3
. Por lo tanto, 0.1 + 0.2 === 0.3
devolverá false
.
Aunque este comportamiento puede parecer extraño, es importante recordar que afecta a todos los lenguajes que utilizan el estándar IEEE-754 para los números de punto flotante, no sólo a JavaScript.
Cuando se trabaja con números decimales en JavaScript (o cualquier otro lenguaje con la misma característica), es buena práctica evitar hacer comparaciones directas. En lugar de ello, puedes comparar contra un "rango de error" o "epsilon" para tener en cuenta la posible falta de precisión.
Aprovechando la constante incorporada Number.EPSILON
, podrías cambiar tu comparación a algo como esto:
console.log(Math.abs((0.1 + 0.2) - 0.3) <= Number.EPSILON);
Esto garantiza que estás dentro de una diferencia aceptable, permitiendo que los cálculos sean precisos a pesar de los pequeños errores de precisión.
En conclusión, aunque la pregunta inicial pueda parecer contraintuitiva, se reduce a cómo JavaScript maneja la aritmética de punto flotante detrás de escena. Al entender esta implementación, puedes evitar errores sutiles en tu código.