redondear - Puntos decimales de Flotación de Python 3/Precisión
redondear decimales python (4)
En una palabra, no puedes.
3.65
no se puede representar exactamente como un float
. El número que obtiene es el número más cercano a 3.65
que tiene una representación de float
exacta.
La diferencia entre (más antiguo?) Python 2 y 3 se debe exclusivamente al formateo predeterminado.
Estoy viendo lo siguiente tanto en Python 2.7.3 como en 3.3.0:
In [1]: 3.65
Out[1]: 3.65
In [2]: ''%.20f'' % 3.65
Out[2]: ''3.64999999999999991118''
Para un tipo de datos decimal exacto, vea decimal.Decimal
.
Estoy leyendo un archivo de texto con números de coma flotante, todos con 1 o 2 puntos decimales. Estoy usando float()
para convertir una línea en un flotante y generar un ValueError
si falla. Estoy almacenando todas las carrozas en una lista. Al imprimirlo, me gustaría imprimirlo como un punto flotante de 2 decimales.
Supongamos que tengo un archivo de texto con los números -3,65, 9,17, 1. Leo cada uno, y una vez que los convierto en flotar y los anexo a una lista. Ahora en Python 2, llamar a float(-3.65)
devuelve -3.65
. En Python 3, sin embargo, float(-3.65) returns
-3.6499999999999999`, que pierde su precisión.
Quiero imprimir la lista de flotantes, [-3.6499999999999999, 9.1699999999999999, 1.0]
con 2 decimales solamente. Hacer algo en la línea de ''%.1f'' % round(n, 1)
devolvería una cadena. ¿Cómo puedo devolver una lista de los dos puntos decimales de flotantes y no de cadenas? Hasta ahora, lo redondeé usando [round(num, 2) for num in list]
pero necesitaría establecer los puntos decimales / precisión en lugar de round()
.
La forma más sencilla de hacerlo es mediante el uso de buit-in redondo.
round(2.6463636263,2)
se mostraría como 2.65
.
Intenta comprender a través de esta función a continuación usando python3
def floating_decimals(f_val, dec):
prc = "{:."+str(dec)+"f}" #first cast decimal as str
print(prc) #str format output is {:.3f}
return prc.format(f_val)
print(floating_decimals(50.54187236456456564, 3))
La salida es: 50.542
¡Espero que esto te ayude!
Los comentarios indican que el objetivo es imprimir con 2 decimales .
Hay una respuesta simple para Python 3:
>>> num=3.65
>>> "The number is {:.2f}".format(num)
''The number is 3.65''
o equivalentemente con f-strings (Python 3.6+):
>>> num = 3.65
>>> f"The number is {num:.2f}"
''The number is 3.65''
Como siempre, el valor flotante es una aproximación:
>>> "{}".format(f)
''3.65''
>>> "{:.10f}".format(f)
''3.6500000000''
>>> "{:.20f}".format(f)
''3.64999999999999991118''
Creo que la mayoría de los casos de uso querrán trabajar con flotadores y luego solo imprimir con una precisión específica.
Aquellos que quieren que los números se almacenen con exactamente 2 dígitos decimales de precisión, sugiero usar el tipo decimal . Más lectura sobre precisión de punto flotante para aquellos que estén interesados.