Chisme 173 del Lince: decimales en Python, el resultado raro del pluviómetro
Sierra Bermeja, de madrugada. Víctor Vílchez, el Lince de la Noche, revisa el cuaderno donde apunta la lluvia que recoge su pluviómetro. Tres noches seguidas, la misma cantidad: 9.8 milímetros.
—Fácil —dice, y escribe un programa de tres líneas en el portátil—. Nueve coma ocho por tres. Veintinueve coma cuatro.
Pulsa ejecutar. En la pantalla aparece:
29.400000000000002
El Lince se queda mirando los ceros.
—Está roto.
La Gata Montesa se asoma por encima de su hombro.
—No ha dado ningún error. Yo diría que ha hecho justo lo que le has pedido.
Introducción
Hoy trabajamos los decimales en Python: un programa que se ejecuta sin errores y, aun así, da un resultado que parece raro.
Antes de la clase, pruébalo en el simulador de decimales en Python del Chisme 173. Son cinco minutos: ejecutas el programa paso a paso y haces tus propias cuentas.

El programa
Son solo ocho líneas, con el estilo de siempre:
lluvia = 9.8 # mm que cae cada noche
noches = 3
total = lluvia * noches
print(total) # 29.400000000000002
print(round(total, 2)) # 29.4
print(total) # ¿ha cambiado?
print(total == 29.4)
print(abs(total - 29.4) < 0.000001)
Ejecútalo en PyCharm con Python 3.13 y compara con el simulador.
Mostrar no es lo mismo que calcular
La línea print(round(total, 2)) escribe 29.4. Parece que ha arreglado el problema, pero fíjate en la línea siguiente: print(total) vuelve a escribir 29.400000000000002.
round ha cambiado lo que se muestra, no lo que está guardado en total. Por eso la comparación total == 29.4 da False: Python compara los números tal como los tiene guardados.
Por qué pasa esto
Un ordenador guarda los decimales con una cantidad limitada de cifras, y en base 2 en lugar de base 10. Igual que en base 10 no podemos escribir 1/3 exactamente (0.3333…), en base 2 hay números como 0.1 o 9.8 que tampoco caben exactos.
El ordenador guarda el más cercano que sí puede. Al multiplicar, esa pequeña diferencia aparece en el último decimal. No es un fallo de Python: lo hacen casi todos los lenguajes.
Cómo probar los decimales en Python
- Pulsa «Ejecutar paso a paso» y mira la caja negra (lo que muestra
print) y la caja de memoria (lo que Python tiene guardado). - Cambia de caso: 0.1 × 3, 1.1 × 3 y 2.5 × 4. ¿En cuál no pasa nada?
- En «Haz tus propias cuentas», prueba
0.1 + 0.2y0.1 + 0.2 == 0.3. - Prueba
round(0.1 + 0.2, 2) == 0.3. ¿Qué ocurre ahora y por qué?

Preguntas de comprobación
Las comentamos en voz alta al empezar la clase.
- ¿Qué número escribe
print(total)en el primer caso? ¿Es el que esperabas? - Si
print(round(total, 2))escribe 29.4, ¿qué valor tienetotaldespués? - ¿Por qué
total == 29.4daFalse, aunque «a ojo» sean iguales?
Qué hemos aprendido
- Un programa puede ejecutarse sin errores y dar un número con decimales inesperados.
- Mostrar un número (
print,round) no cambia el número que hay guardado. - Comparar decimales con
==es peligroso: es mejor comprobar que la diferencia es muy pequeña.
Para seguir investigando
- Qué ocurre con los decimales en Python: aritmética de punto flotante, en el tutorial oficial.
- Medir no es medir bien: el Chisme 147, termómetro con micro:bit.
- Otra estación que mide con una placa: el Chisme 125, la estación meteorológica.
- Todos los chismes, en el catálogo de los Chismes del Lince.
Y ahora, una pregunta
El Lince corrige el cuaderno: 29.4 milímetros. Pero antes de cerrar el portátil se detiene.
—Un momento. El programa multiplicó bien. El resultado no es el que yo esperaba. Entonces… ¿falla el programa o falla lo que esperamos de él?
Eso lo resolvemos en clase.
Ejemplo educativo: las cantidades de lluvia son inventadas.
Etiqueta:2º bachillerato, AIDARAC, coma flotante, decimales python, ies monterroso, montesteam, python
