web-dev-qa-db-fra.com

Python 3 points décimaux flottants / précision

Je lis un fichier texte avec des nombres à virgule flottante, tous avec 1 ou 2 décimales. J'utilise float() pour convertir une ligne en float et lève un ValueError si cela échoue. Je stocke tous les flottants dans une liste. Lors de l’impression, j’aimerais l’imprimer sous forme de virgule flottante à deux décimales.

Supposons que j'ai un fichier texte avec les nombres -3,65, 9,17, 1. Je les lis chacun, et une fois que je les convertis en float, je les ajoute à une liste. Maintenant dans Python 2, appeler float(-3.65) renvoie -3.65. Dans Python 3 cependant, float(-3.65) returns-3.6499999999999999` qui perd sa précision.

Je veux imprimer la liste des flottants, [-3.6499999999999999, 9.1699999999999999, 1.0] Avec 2 décimales seulement. Faire quelque chose dans le sens de '%.1f' % round(n, 1) renverrait une chaîne. Comment puis-je renvoyer une liste de tous les deux décimales de flottants, et non des chaînes? Jusqu'ici, je l'ai arrondi en utilisant [round(num, 2) for num in list], mais je devrais définir les points décimaux/la précision au lieu de round().

31
darksky

En un mot, vous ne pouvez pas.

3.65 ne peut pas être représenté exactement comme un float. Le nombre que vous obtenez est le nombre le plus proche de 3.65 qui a une représentation exacte float.

La différence entre (old?) Python 2 et 3 est uniquement due au formatage par défaut).

Je vois ce qui suit dans Python 2.7.3 et 3.3.0:

In [1]: 3.65
Out[1]: 3.65

In [2]: '%.20f' % 3.65
Out[2]: '3.64999999999999991118'

Pour un type de données décimal exact, voir decimal.Decimal .

24
NPE

Pour ce faire, utilisez le tour intégré.

round(2.6463636263,2) serait affiché comme 2.65.

37
slurry

Les commentaires indiquent que l'objectif est d'imprimer avec 2 décimales .

Il existe une réponse simple à Python 3:

>>> num=3.65
>>> "The number is {:.2f}".format(num)
'The number is 3.65'

ou équivalent aux chaînes de caractères f (Python 3.6+):

>>> num = 3.65
>>> f"The number is {num:.2f}"
'The number is 3.65'

Comme toujours, la valeur float est une approximation:

>>> "{}".format(f)
'3.65'
>>> "{:.10f}".format(f)
'3.6500000000'
>>> "{:.20f}".format(f)
'3.64999999999999991118'

Je pense que la plupart des cas d'utilisation voudront travailler avec des flottants et ensuite seulement imprimer avec une précision spécifique.

Ceux qui souhaitent que les nombres eux-mêmes soient stockés avec exactement 2 chiffres décimaux, je suggère d'utiliser le type décimal . Plus d'informations sur la précision en virgule flottante pour ceux qui sont intéressés.

31
Andrew E

Essaye ça:

num = input("Please input your number: ")

num = float("%0.2f" % (num))

print(num)

Je crois que c'est beaucoup plus simple. Pour 1 place décimale, utilisez %0.1f. Pour 2 décimales, utilisez %0.2f etc.

Ou, si vous voulez réduire le tout à 2 lignes:

num = float("%0.2f" % (float(input("Please input your number: "))))
print(num)
5
S.Ahmed

Essayez de comprendre à travers cette fonction ci-dessous en utilisant 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 sortie est: 50.542

J'espère que cela vous aide!

2
ArifMustafa