Todos los artículos

IEEE 754: por qué 0.1 + 0.2 no es igual a 0.3 en el código

Abre el intérprete de Python y escribe 0.1 + 0.2 — en lugar de 0.3, obtienes 0.30000000000000004. No es un error de Python: es una consecuencia directa de cómo el estándar IEEE 754 representa los números fraccionarios en binario, y el mismo resultado aparece en JavaScript, Java, C# y casi cualquier otro lenguaje que use este estándar.

Las tres partes de un número de punto flotante

Un número IEEE 754 se almacena como tres componentes: un signo (positivo o negativo), una mantisa (los dígitos significativos del número) y un exponente (la potencia por la que se desplaza el punto decimal). Es similar a la notación científica: 1.5 × 10², pero en binario.

Por qué 0.1 no se puede representar exactamente en binario

0.1 en decimal es una fracción infinita en binario (similar a cómo 1/3 es infinito en decimal). Una computadora solo almacena una cantidad limitada de bits de mantisa, así que el número se redondea al valor representable más cercano — y ese redondeo es precisamente lo que produce el "error" visible.

Dónde esto realmente causa problemas: carritos de compra y facturas

Una página de pago que suma los precios de los artículos como floats simples puede desviarse uno o dos centavos del total esperado después de suficientes artículos — cada suma redondea ligeramente, y los errores se acumulan en lugar de cancelarse. Por eso los sistemas de pago suelen trabajar con centavos como enteros, o usan un tipo decimal dedicado, en vez de sumar floats directamente.

Para qué se necesita esto

  • Entender y diagnosticar errores de redondeo inesperados en cálculos financieros o científicos.
  • Ver la representación binaria exacta de un número de punto flotante concreto.
  • Explicar a un colega o estudiante por qué comparar números fraccionarios por igualdad exacta es una mala práctica.

Números subnormales cerca de cero

Cuando el valor de un número es demasiado pequeño para la representación habitual (una mantisa que empieza con un 1 implícito), IEEE 754 pasa al modo subnormal (desnormalizado), donde se descarta ese 1 implícito — esto permite representar números aún más pequeños en magnitud a costa de una pérdida gradual de precisión en lugar de un salto brusco a cero. Esta transición "suave" hacia cero es preferible a un cero abrupto, pero los cálculos subnormales son notablemente más lentos que los normales en algunos procesadores.

Probar la herramienta