Problema de redondeo Python

>>> num = 4.123456 >>> round(num, 3) # expecting 4.123 4.1230000000000002 

Estoy esperando 4.123 como resultado, ¿Me equivoco?

Si desea tener una representación exacta de su número de punto flotante, tiene que usar decimal .

Esto no es un error. Debe leer lo que todo científico informático debe saber sobre la aritmética de punto flotante:

http://docs.sun.com/source/806-3568/ncg_goldberg.html

Sí, sus expectativas no coinciden con la intención de diseño de sus herramientas.

Echa un vistazo a esta sección del tutorial de Python.


Usar math.round es en realidad bastante raro. Si está intentando mostrar un número como una cadena con una cierta precisión, es posible que desee algo más parecido a

 >>> num = 4.123456 >>> print "%.3f" % num 4.123 

Es posible que esté interesado en la documentación sobre el formato de cadena .

¿Por qué te importa? (Esa es una pregunta seria)

La respuesta que está recibiendo es tan cercana a 4.123 como para no hacer ninguna diferencia. No puede ser exactamente 4.123 , ya que solo hay un número finito de números (alrededor de 2**64 en una máquina típica) que Python puede representar exactamente, y sin entrar en detalles sobre las representaciones de punto flotante, da la casualidad de que 4.123 no está No sea uno de esos números. Por cierto, 4.1230000000000002 tampoco es uno de los números que se pueden representar exactamente; el número real almacenado es 4.12300000000000022026824808563105762004852294921875 , pero Python trunca la representación decimal a 17 dígitos significativos para fines de visualización. Asi que:

  1. Si estás haciendo matemáticas con el resultado, entonces la diferencia entre 4.123 y lo que 4.123 es tan pequeña que no hace ninguna diferencia real. Simplemente no te preocupes por eso.
  2. Si solo te importa que la salida se vea bonita (es decir, lo que estás buscando aquí es una cadena en lugar de un número), entonces utiliza el formato de cadena o cadena.
  3. En el caso poco probable de que la diferencia realmente importe, por ejemplo, porque está haciendo un trabajo financiero y esto afecta la dirección en que algo redondea más adelante, use el módulo decimal .

Nota final: en Python 3.xy Python 2.7, la repr de un flotador ha cambiado, por lo que realmente obtendrás 4.123 como esperas aquí.