Dígitos corrigidos após decimal com strings f


320

Existe uma maneira fácil com as f-strings do Python para corrigir o número de dígitos após o ponto decimal? (Especificamente, f-strings, não outras opções de formatação de strings, como .format ou%)

Por exemplo, digamos que eu queira exibir 2 dígitos após a casa decimal.

Como faço isso? Digamos que

a = 10.1234

Respostas:


477

Inclua o especificador de tipo na sua expressão de formato:

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

33
Nenhum dos exemplos de formatação de string f que encontrei, incluindo o PEP, mostra que você pode usar o especificador de tipo. Acho que deveria ter assumido isso, mas os documentos que chamam isso seriam bons.
GafferMan2112

Você está certo, a maioria dos exemplos não possui um especificador de formato. No PEP, o exemplo hexadecimal faz f'input={value:#06x}':, e os exemplos de data e hora fazem: {anniversary:%A, %B %d, %Y}e {date:%A}. Acho que a principal explicação está na seção Equivalência de código .
26417 Robh

9
Oh cara, isso é lindo e simples. Por que demorei mais de 45 segundos para encontrar esta resposta? Até o jogo, Google.
Matt Fletcher

2
note também que sem f se você escrever - f '{a: 0,2}' contará número total de dígitos e resposta será 10
Drako

88

Quando se trata de floatnúmeros, você pode usar especificadores de formato :

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

Onde:

  • value é qualquer expressão que é avaliada como um número
  • widthespecifica o número de caracteres usados ​​no total para exibição, mas se valueprecisar de mais espaço do que a largura especifica, o espaço adicional será usado.
  • precision indica o número de caracteres usados ​​após o ponto decimal

O que está faltando é o especificador de tipo para o seu valor decimal. Neste link , você encontra os tipos de apresentação disponíveis para ponto flutuante e decimal.

Aqui você tem alguns exemplos, usando o ftipo de apresentação (Ponto fixo):

# 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

Adicionando à resposta de Robᵩ: caso você queira imprimir números bastante grandes, usar mil separadores pode ser uma grande ajuda (observe a vírgula).

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

15

Use especificadores de formato com strings ( mais aqui ).

  • Você pode controlar o número de casas decimais :
pi = 3.141592653589793238462643383279

print(f'The first 6 decimals of pi are {pi:.6f}.')
The first 6 decimals of pi are 3.141593.
  • Você pode converter para porcentagem :
grade = 29/45

print(f'My grade rounded to 3 decimals is {grade:.3%}.')
My grade rounded to 3 decimals is 64.444%.
  • Você pode fazer outras coisas, como imprimir comprimento 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$
  • Ou mesmo imprima com um separador de vírgula mil :
print(f'I am worth {10000000000:,}$')
I am worth 10,000,000,000$

1
a = 10.1234

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

em 0.2f:

  • 0 está dizendo ao python para não colocar limite no número total de dígitos a serem exibidos
  • .2 está dizendo que queremos usar apenas 2 dígitos após o decimal (o resultado será o mesmo que uma função round ())
  • f está dizendo que é um número flutuante. Se você esquecer f, ele imprimirá apenas 1 dígito após o decimal. Nesse caso, haverá apenas 1 dígito após o decimal.

Um vídeo detalhado sobre string f para números https://youtu.be/RtKUsUTY6to?t=606


-2

Para arredondar ...

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}")

Saída: 2000/01/30 15: 10: 15.001


isso não tem nada a ver com a pergunta e esta conta não está ativa desde este post
Nicolas Gervais
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.