Dígitos fijos después del decimal con cadenas f

320

¿Hay alguna manera fácil con las cadenas f de Python para corregir el número de dígitos después del punto decimal? (Específicamente cadenas f, no otras opciones de formato de cadena como .format o%)

Por ejemplo, digamos que quiero mostrar 2 dígitos después del lugar decimal.

¿Cómo puedo hacer eso? Digamos que

a = 10.1234
GafferMan2112
fuente

Respuestas:

477

Incluya el especificador de tipo en su expresión de formato:

>>> a = 10.1234
>>> f'{a:.2f}'
'10.12'
Robᵩ
fuente
33
Ninguno de los ejemplos de formato de cadena f que he encontrado, incluido el PEP, muestra que puede usar el especificador de tipo. Supongo que debería haber asumido eso, pero los documentos que lo llamarían estarían bien.
GafferMan2112
Tienes razón, la mayoría de los ejemplos no tienen un especificador de formato. En el PEP, el ejemplo hexadecimal hace:, f'input={value:#06x}'y los ejemplos de fecha y hora hacen: {anniversary:%A, %B %d, %Y}y {date:%A}. Creo que la explicación clave está en la sección de Equivalencia de Código .
Robᵩ
99
Oh hombre, esto es hermoso y simple. ¿Por qué me tomó más de 45 segundos enteros encontrar esta respuesta? Hasta tu juego, Google.
Matt Fletcher
2
también tenga en cuenta que sin f si escribe - f '{a: .2}' contará el número total de dígitos y la respuesta será 10
Drako
88

Cuando se trata de floatnúmeros, puede usar especificadores de formato :

f'{value:{width}.{precision}}'

dónde:

  • value es cualquier expresión que se evalúe como un número
  • widthespecifica el número de caracteres utilizados en total para mostrar, pero si valuenecesita más espacio que el ancho especificado, se utiliza el espacio adicional.
  • precision indica el número de caracteres utilizados después del punto decimal

Lo que falta es el especificador de tipo para su valor decimal. En este enlace , encontrará los tipos de presentación disponibles para coma flotante y decimal.

Aquí tiene algunos ejemplos, utilizando el ftipo de presentación (Punto fijo):

# notice that it adds spaces to reach the number of characters specified by width
In [1]: f'{1 + 3 * 1.5:10.3f}'
Out[1]: '     5.500'

# notice that it uses more characters than the ones specified in width
In [2]: f'{3000 + 3 ** (1 / 2):2.1f}' 
Out[2]: '3001.7'

In [3]: f'{1.2345 + 4 ** (1 / 2):9.6f}'
Out[3]: ' 3.234500'

# omitting width but providing precision will use the required characters to display the number with the the specified decimal places
In [4]: f'{1.2345 + 3 * 2:.3f}' 
Out[4]: '7.234'

# not specifying the format will display the number with as many digits as Python calculates
In [5]: f'{1.2345 + 3 * 0.5}'
Out[5]: '2.7344999999999997'
lmiguelvargasf
fuente
34

Agregando a la respuesta de Robᵩ: en caso de que desee imprimir números bastante grandes, usar miles de separadores puede ser de gran ayuda (tenga en cuenta la coma).

>>> f'{a*1000:,.2f}'
'10,123.40'
Bouncner
fuente
15

Use especificadores de formato con cadenas f ( más aquí ).

  • Puedes controlar el número de decimales :
pi = 3.141592653589793238462643383279

print(f'The first 6 decimals of pi are {pi:.6f}.')
The first 6 decimals of pi are 3.141593.
  • Puedes convertir a porcentaje :
grade = 29/45

print(f'My grade rounded to 3 decimals is {grade:.3%}.')
My grade rounded to 3 decimals is 64.444%.
  • Puede hacer otras cosas como imprimir longitud constante :
from random import randint
for i in range(5):
    print(f'My money is {randint(0, 150):>3}$')
My money is 126$
My money is   7$
My money is 136$
My money is  15$
My money is  88$
  • O incluso imprima con un separador de mil comas :
print(f'I am worth {10000000000:,}$')
I am worth 10,000,000,000$
Nicolas Gervais
fuente
1
a = 10.1234

print(f"{a:0.2f}")

en 0.2f:

  • 0 le dice a Python que no ponga límite al número total de dígitos para mostrar
  • .2 dice que queremos tomar solo 2 dígitos después del decimal (el resultado será el mismo que una función round ())
  • f dice que es un número flotante. Si olvida f, imprimirá 1 dígito menos después del decimal. En este caso, será solo 1 dígito después del decimal.

Un video detallado sobre f-string para números https://youtu.be/RtKUsUTY6to?t=606

Rahul Sharma
fuente
-2

Para redondear ...

import datetime as dt
now = dt.datetime(2000, 1, 30, 15, 10, 15, 900)
now_mil = round(now.microsecond/1000)
print(f"{now:%Y/%m/%d %H:%M:%S.}{now_mil:03}")

Salida: 2000/01/30 15: 10: 15.001

Kevin
fuente
esto no tiene nada que ver con la pregunta y esta cuenta no ha estado activa desde esta publicación
Nicolas Gervais