Limitar los flotadores a dos decimales

Resuelto asked hace 15 años • 0 respuestas

Quiero aque 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? .

 avatar Jan 19 '09 01:01
Aceptado

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:

  1. 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.
  2. O utilice un número de coma fija como decimal .
Rex Logan avatar Jan 18 '2009 18:01 Rex Logan

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
Xolve avatar Jun 30 '2011 18:06 Xolve

El integrado round()funciona bien en Python 2.7 o posterior.

Ejemplo:

>>> round(14.22222223, 2)
14.22

Consulta la documentación .

chribsen avatar Dec 31 '2016 10:12 chribsen

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')
Matt Fletcher avatar Dec 12 '2017 14:12 Matt Fletcher

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.

grant zukowski avatar Jan 25 '2015 22:01 grant zukowski