2084 votes

python limitant les flottants à deux décimales

Je veux que a soit arrondi à 13.95

>>> a
13.949999999999999

>>> round(a, 2)
13.949999999999999

La fonction d'arrondi ne fonctionne pas [comme je l'espère].

55voto

user570826 Points 307

Avec python < 3 (par exemple 2.6 ou 2.7), il y a deux façons de procéder.

# Option one 
older_method_string = "%.9f" % numvar

# Option two 
newer_method_string = "{.9f}".format(numvar)

Mais notez que pour les versions de python supérieures à 3 (par exemple 3.2 ou 3.3), l'option deux est préféré

Pour plus d'informations sur l'option deux, je vous suggère ce lien sur formatage des chaînes de caractères à partir de la documentation python .

Et pour plus d'informations sur la première option, ce lien suffira et contient des informations sur les différents drapeaux.

Réflexion : Python : Convertir un nombre à virgule flottante avec une certaine précision, puis le copier dans une chaîne de caractères.

24voto

nosklo Points 75862

Le tutoriel python comporte un appendice intitulé : Arithmétique en virgule flottante : problèmes et limites . Lisez-le. Il explique ce qui se passe et pourquoi python fait de son mieux. Il contient même un exemple qui correspond au vôtre. Permettez-moi d'en citer un extrait :

>>> 0.1
0.10000000000000001

vous pouvez être tenté d'utiliser le round() pour le réduire à l'unique chiffre que vous attendez. Mais cela ne fait aucune différence :

>>> round(0.1, 1)
0.10000000000000001

Le problème est que la valeur binaire à virgule flottante stockée pour “0.1” était déjà la meilleure approximation binaire possible approximation binaire de 1/10 donc essayer de l'arrondir à nouveau ne peut pas le rendre meilleur : c'était déjà aussi bon que possible.

Une autre conséquence est que, puisque 0.1 n'est pas exactement 1/10 en additionnant dix valeurs de 0.1 peut ne pas donner exactement 1.0 soit :

>>> sum = 0.0
>>> for i in range(10):
...     sum += 0.1
...
>>> sum
0.99999999999999989

Une alternative et une solution à vos problèmes serait d'utiliser l'application decimal module.

13voto

HUAGHAGUAH Points 1369

Il fait exactement ce que vous lui avez dit de faire, et il fonctionne correctement. Pour en savoir plus confusion en virgule flottante et peut-être essayer Décimal à la place.

7voto

Pour fixer la virgule flottante dans les langages dynamiques de type tels que Python et Javascript j'utilise cette technique

# for example:
a=70000
b=0.14
c=a*b

print c # prints 980.0000000002
#try to fix 
c=int(c * 10000)/100000
print c # prints 980

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X