Chiffres fixes après la décimale avec des chaînes f

320

Existe-t-il un moyen simple avec les chaînes f de Python de fixer le nombre de chiffres après le point décimal? (Plus précisément les chaînes f, pas les autres options de formatage de chaînes comme .format ou%)

Par exemple, supposons que je souhaite afficher 2 chiffres après la décimale.

Comment je fais ça? Disons que

a = 10.1234
GafferMan2112
la source

Réponses:

477

Incluez le spécificateur de type dans votre expression de format:

>>> a = 10.1234
>>> f'{a:.2f}'
'10.12'
Robᵩ
la source
33
Aucun des exemples de formatage de chaîne f que j'ai trouvés, y compris le PEP, ne montre que vous pouvez utiliser le spécificateur de type. Je suppose que j'aurais dû supposer cela, mais les docs qui l'appelaient seraient bien.
GafferMan2112
Vous avez raison, la plupart des exemples n'ont pas de spécificateur de format. Dans le PEP, l'exemple hexadécimal fait f'input={value:#06x}':, et les exemples datetime font: {anniversary:%A, %B %d, %Y}et {date:%A}. Je pense que l'explication clé se trouve dans la section Équivalence de code .
Robᵩ
9
Oh mec, c'est magnifique et simple. Pourquoi m'a-t-il fallu plus de 45 secondes entières pour trouver cette réponse? Up ya jeu, Google.
Matt Fletcher
2
notez également que sans f si vous écrivez - f '{a: .2}', il comptera le nombre total de chiffres et la réponse sera 10
Drako
88

En ce qui concerne les floatnombres, vous pouvez utiliser des spécificateurs de format :

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

où:

  • value est une expression qui correspond à un nombre
  • widthspécifie le nombre de caractères utilisés au total à afficher, mais si a valuebesoin de plus d'espace que la largeur spécifiée, l'espace supplémentaire est utilisé.
  • precision indique le nombre de caractères utilisés après le point décimal

Ce qui vous manque, c'est le spécificateur de type pour votre valeur décimale. Dans ce lien , vous trouverez les types de présentation disponibles pour virgule flottante et décimale.

Voici quelques exemples d'utilisation du ftype de présentation (Point fixe):

# 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
la source
34

Ajout à la réponse de Robᵩ: au cas où vous voudriez imprimer des nombres plutôt grands, l'utilisation de mille séparateurs peut être d'une grande aide (notez la virgule).

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

Utilisez des spécificateurs de format avec des chaînes f ( plus ici ).

  • Vous pouvez contrôler le nombre de décimales :
pi = 3.141592653589793238462643383279

print(f'The first 6 decimals of pi are {pi:.6f}.')
The first 6 decimals of pi are 3.141593.
  • Vous pouvez convertir en pourcentage :
grade = 29/45

print(f'My grade rounded to 3 decimals is {grade:.3%}.')
My grade rounded to 3 decimals is 64.444%.
  • Vous pouvez faire d'autres choses comme imprimer une longueur 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 même imprimez avec un séparateur de milliers de virgules :
print(f'I am worth {10000000000:,}$')
I am worth 10,000,000,000$
Nicolas Gervais
la source
1
a = 10.1234

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

en 0.2f:

  • 0 indique à python de ne mettre aucune limite sur le nombre total de chiffres à afficher
  • .2 signifie que nous voulons prendre seulement 2 chiffres après la décimale (le résultat sera le même qu'une fonction round ())
  • f dit que c'est un nombre flottant. Si vous oubliez f, il imprimera simplement 1 chiffre de moins après la décimale. Dans ce cas, ce sera seulement 1 chiffre après la décimale.

Une vidéo détaillée sur f-string pour les nombres https://youtu.be/RtKUsUTY6to?t=606

Rahul Sharma
la source
-2

Pour arrondir ...

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

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

Kevin
la source
cela n'a rien à voir avec la question et ce compte n'a plus été actif depuis ce post
Nicolas Gervais