Pregunta Limitar los flotadores a dos decimales


yo quiero a ser redondeado a 13.95.

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

los round la función no funciona de la manera que esperaba.


1118
2018-01-18 18:16


origen


Respuestas:


Se está encontrando con el viejo problema con los números de coma flotante de que no se pueden representar todos los números. La línea de comando solo muestra la forma de coma flotante completa de la memoria.

En punto flotante, su versión redondeada es el mismo número. Como las computadoras son binarias, almacenan números de coma flotante como un número entero y luego lo dividen por una potencia de dos, por lo que 13.95 se representará de manera similar a 125650429603636838 / (2 ** 53).

Los números de precisión doble tienen 53 bits (16 dígitos) de precisión y los flotadores regulares tienen 24 bits (8 dígitos) de precisión. los punto flotante en Python usa doble precisión para almacenar los valores.

Por ejemplo,

  >>> 125650429603636838/(2**53)
  13.949999999999999

  >>> 234042163/(2**24)
  13.949999988079071

  >>> a=13.946
  >>> print(a)
  13.946
  >>> print("%.2f" % a)
  13.95
  >>> round(a,2)
  13.949999999999999
  >>> print("%.2f" % round(a,2))
  13.95
  >>> print("{0:.2f}".format(a))
  13.95
  >>> print("{0:.2f}".format(round(a,2)))
  13.95
  >>> print("{0:.15f}".format(round(a,2)))
  13.949999999999999

Si busca solo dos lugares decimales como en la moneda, entonces tiene un par de mejores opciones: 1) Use enteros y valores de la tienda en centavos, no en dólares y luego divida entre 100 para convertir a dólares. 2) O use un número de punto fijo como decimal.


1154
2018-01-18 18:23



Hay nuevas especificaciones de formato, Especificación de formato de cadena Mini-Lenguaje:

Puedes hacer lo mismo que:

"{0:.2f}".format(13.949999999999999)

Nota que lo anterior devuelve una cadena. Para obtener como flotar, simplemente envuelve con float(...):

float("{0:.2f}".format(13.949999999999999))

Nota ese envoltorio con float() no cambia nada:

>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{0:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True

423
2018-06-30 18:53



El built-in round() funciona bien en Python 2.7 o posterior.

Ejemplo:

>>> round(14.22222223, 2)
14.22

Revisa la documentación.


138
2017-12-31 10:51



Siento que el enfoque más simple es usar el format() función.

Por ejemplo:

a = 13.949999999999999
format(a, '.2f')

13.95

Esto produce un número flotante como una cadena redondeada a dos decimales.


118
2018-01-25 22:26



La mayoría de los números no se pueden representar exactamente en carrozas. Si desea redondear el número porque eso es lo que requiere su fórmula matemática o algoritmo, entonces quiere usar round. Si solo quiere restringir la pantalla a una cierta precisión, entonces ni siquiera use la forma redonda y simplemente formatéela como esa cadena. (Si desea mostrarlo con algún método de redondeo alternativo, y hay toneladas, entonces necesita mezclar los dos enfoques).

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

Y, por último, aunque quizás lo más importante, si quieres exacto matemática entonces no quieres flotadores en absoluto. El ejemplo habitual es tratar con dinero y almacenar 'centavos' como un número entero.


85
2018-01-18 18:40



Pruebe el siguiente código:

>>> a = 0.99334
>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up
>>> print a
0.99

65
2017-08-26 06:46



Con Python <3 (por ejemplo, 2.6 o 2.7), hay dos formas de hacerlo.

# Option one 
older_method_string = "%.9f" % numvar

# Option two (note ':' before the '.9f')
newer_method_string = "{:.9f}".format(numvar)

Pero tenga en cuenta que para las versiones de Python superiores a 3 (por ejemplo, 3.2 o 3.3), la opción dos es privilegiado.

Para obtener más información sobre la opción dos, sugiero este enlace en formateo de cadena de la documentación de Python.

Y para más información sobre la opción uno, este enlace será suficiente y tiene información sobre las diferentes banderas.

Referencia: Convierta el número de punto flotante a una cierta precisión, y luego copie a una cadena


49
2017-12-11 06:37



Puede modificar el formato de salida:

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95

39
2018-01-18 18:31



Utilizar

print"{:.2f}".format(a)

en lugar de

print"{0:.2f}".format(a)

Debido a que este último puede conducir a errores de salida al tratar de generar múltiples variables (ver comentarios).


37
2017-08-04 08:40