SincroDev Logo SincroDev

¿Por qué 0.1 + 0.2 no es 0.3? Entendiendo IEEE-754 Interactivamente


¿Alguna vez has abierto la consola de tu navegador y has escrito 0.1 + 0.2? Si lo haces, te llevarás una sorpresa:

0.1 + 0.2
// Resultado: 0.30000000000000004

No, tu computadora no está rota. Simplemente habla un idioma diferente al tuyo. Mientras tú piensas en base 10 (decimal), ella piensa en base 2 (binario). Y al igual que 1/3 no tiene una representación finita en decimal (0.3333…), 0.1 no tiene una representación finita en binario.

El Estándar IEEE-754

Para almacenar números con decimales (coma flotante) de manera eficiente, casi todas las computadoras modernas usan el estándar IEEE-754.

Un número de “precisión simple” (32 bits, como el float en C o Java) se divide en tres partes:

  1. 🔴 Signo (1 bit): Determina si es positivo (0) o negativo (1).
  2. 🟢 Exponente (8 bits): Determina la magnitud del número (dónde va la coma). Usa un “sesgo” de 127.
  3. 🔵 Mantisa (23 bits): Contiene los dígitos significativos del número (la precisión).

Visualizador Interactivo

¡Basta de teoría! Toca los bits tú mismo. Cambia el número decimal o haz clic en los casilleros (bits) para encenderlos/apagarlos y ver cómo muta el valor.

Signo (1 bit)
Exponente (8 bits)
Mantisa (23 bits)
Signo
(-1)^0
+
Exponente
2^(124-127)
0
Mantisa (1.f)
1 + 0.25...
1.25
Cálculo Final
+1 * 1.25 * 2^-3 = 0.15625

Puntos Clave para Probar:

  • El cero: Intenta poner todo en 0. ¿Qué pasa si solo enciendes el bit de signo (el rojo)? Obtienes -0.
  • Infinito: Pon todos los bits verdes (Exponente) en 1 y todos los azules (Mantisa) en 0. Resultado: Infinity.
  • NaN (Not a Number): Pon todos los bits verdes en 1 y enciende cualquier bit azul. Resultado: NaN.
  • 0.1: Escribe 0.1 en la caja de texto. Fíjate en el patrón que se repite en la mantisa (los bits azules). Nunca termina exactamente, se corta. Ahí está el error de redondeo.

Conclusión

La próxima vez que veas un error de decimales en una factura generada por tu código, recuerda: no es un error de cálculo, es una característica de la arquitectura.

Para sistemas financieros, nunca uses tipos de punto flotante (float, double). Usa tipos Decimal o trabaja con enteros (centavos) para evitar estos fantasmas de la máquina.