Python float round error 117.285 round a 117.28 no 117.29

Estoy usando python 2.7, y el código que tengo es:

a = 10.5 * 22.34 / 2.0 print "%.2f" % a 

y el resultado que espero sea 117.29, pero muestra 117.28. ¿Como resolver el problema?

Si Python utiliza un tipo de punto flotante binario IEEE-754 de 64 bits, entonces el valor exacto que está usando será

 117.284999999999996589394868351519107818603515625 

… y eso es obviamente más bajo que el punto medio entre 117.28 y 117.29. Es posible que eso sea lo que está pasando.

Otra opción es que Python está utilizando el redondeo de banca .

Si los valores decimales exactos son importantes para usted, es posible que desee considerar el uso de decimal lugar.

El Sr. Skeet tiene la respuesta correcta , a continuación se muestra un ejemplo de cómo usar el módulo decimal al que se refiere:

 import decimal a = decimal.Decimal('117.285') rounded = a.quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_HALF_UP) print rounded # 117.29 repr(rounded) # "Decimal('117.29')" 

Si desea una solución simple y no le importa el rendimiento, podría usar una función como esta para convertir a entero, redondear y convertir de nuevo a flotante:

 def round_exact(number, decimal_places=0): """Round the number to the given number of decimal places by converting to and from integers to avoid floating point error.""" factor = 10**(decimal_places + 1) rounded_int = int(number * factor) if rounded_int % 10 >= 5: # Round up return (int(rounded_int//10) + 1) / float(factor//10) # Round down return int(rounded_int//10) / float(factor//10)