Solución:
Cualquier número que no se pueda construir a partir de potencias exactas de dos no se puede representar exactamente como un número de coma flotante; necesita ser aproximado. A veces, la aproximación más cercana será menor que el número real.
Lea lo que todo informático debería saber sobre la aritmética de coma flotante.
Es muy conocido debido a la naturaleza de los números de coma flotante.
Si desea hacer aritmética decimal, no aritmética de punto flotante, existen bibliotecas para hacer esto.
P.ej,
>>> from decimal import Decimal
>>> Decimal(29)/Decimal(100)
Decimal('0.29')
>>> Decimal('0.29')*100
Decimal('29')
>>> int(Decimal('29'))
29
En general, el decimal probablemente se exceda y aún tendrá errores de redondeo en casos raros cuando el número no tiene una representación decimal finita (por ejemplo, cualquier fracción donde el denominador no es 1 o divisible por 2 o 5 – los factores de la base decimal (10)). Por ejemplo:
>>> s = Decimal(7)
>>> Decimal(1)/s/s/s/s/s/s/s*s*s*s*s*s*s*s
Decimal('0.9999999999999999999999999996')
>>> int(Decimal('0.9999999999999999999999999996'))
0
Por lo tanto, es mejor redondear siempre antes de convertir los puntos flotantes en ints, a menos que desee una función de piso.
>>> int(1.9999)
1
>>> int(round(1.999))
2
Otra alternativa es usar la clase Fraction de la biblioteca de fracciones que no se aproxima. (Simplemente sigue sumando / restando y multiplicando los numeradores y denominadores enteros según sea necesario).