Limitar los flotadores a dos decimales
Quiero a
que me redondeen a 13,95 . Intenté usar round
, pero obtengo:
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
Para un problema análogo con la clase decimal de la biblioteca estándar, consulte ¿Cómo puedo formatear un decimal para que siempre muestre 2 decimales? .
Te encuentras con el viejo problema de los números de coma flotante: no todos los números se pueden representar exactamente. La línea de comando solo le muestra el formulario de punto flotante completo desde la memoria.
Con representación de punto flotante, su versión redondeada es el mismo número. Dado que las computadoras son binarias, almacenan números de coma flotante como un número entero y luego los dividen por una potencia de dos, por lo que 13,95 se representará de manera similar a 125650429603636838/(2**53).
Los números de doble precisión tienen 53 bits (16 dígitos) de precisión y los números flotantes regulares tienen 24 bits (8 dígitos) de precisión. El tipo de 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("{:.2f}".format(a))
13.95
>>> print("{:.2f}".format(round(a, 2)))
13.95
>>> print("{:.15f}".format(round(a, 2)))
13.949999999999999
Si solo busca dos decimales (para mostrar el valor de una moneda, por ejemplo), entonces tiene un par de opciones mejores:
- Utilice números enteros y almacene los valores en centavos, no en dólares, y luego divídalos entre 100 para convertirlos a dólares.
- O utilice un número de coma fija como decimal .
Hay nuevas especificaciones de formato, minilenguaje de especificación de formato de cadena :
Puedes hacer lo mismo que:
"{:.2f}".format(13.949999999999999)
Nota 1: lo anterior devuelve una cadena. Para que quede flotador, simplemente envuélvalo con float(...)
:
float("{:.2f}".format(13.949999999999999))
Nota 2: envolver con float()
no cambia nada:
>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True
El integrado round()
funciona bien en Python 2.7 o posterior.
Ejemplo:
>>> round(14.22222223, 2)
14.22
Consulta la documentación .
Permítanme darles un ejemplo en el formato f-string /template-string de Python 3.6, que creo que es maravillosamente claro:
>>> f'{a:.2f}'
También funciona bien con ejemplos más largos, con operadores y sin necesidad de paréntesis:
>>> print(f'Completed in {time.time() - start:.2f}s')
Siento que el enfoque más sencillo es utilizar la 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.