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

Respuestas:


477

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

>>> a = 10.1234
>>> f'{a:.2f}'
'10.12'

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'

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'

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$

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


-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


esto no tiene nada que ver con la pregunta y esta cuenta no ha estado activa desde esta publicación
— Nicolas Gervais
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.