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].

2057voto

uɐƃoן xǝᴚ Points 4504

Vous vous heurtez au vieux problème des nombres à virgule flottante : tous les nombres ne peuvent pas être représentés. La ligne de commande ne fait que vous montrer la forme complète en virgule flottante de la mémoire. En virgule flottante, votre version arrondie est le même nombre. Les ordinateurs étant binaires, ils stockent les nombres en virgule flottante sous la forme d'un nombre entier qu'ils divisent ensuite par une puissance de deux. Ainsi, 13,95 sera représenté de la même manière que 125650429603636838/(2**53). Les nombres à double précision ont 53 bits (16 chiffres) de précision et les nombres flottants ordinaires ont 24 bits (8 chiffres) de précision. Le site la virgule flottante en python utilise la double précision pour stocker les valeurs.

par exemple

  >>>125650429603636838/(2**53)
  13.949999999999999

  >>> 234042163/(2**24)
  13.949999988079071

  >>> a=13.946
  >>> print(a)
  13.946
  >>> print("%.2f" % a)
  13.95
  >>> round(a,2)
  13.949999999999999
  >>> print("%.2f" % round(a,2))
  13.95
  >>> print("{0:.2f}".format(a))
  13.95
  >>> print("{0:.2f}".format(round(a,2)))
  13.95
  >>> print("{0:.15f}".format(round(a,2)))
  13.949999999999999

Si vous n'avez besoin que de deux décimales, comme dans le cas des devises, vous avez deux meilleurs choix : utilisez des nombres entiers et stockez les valeurs en cents et non en dollars, puis divisez par 100 pour les convertir en dollars. Ou utilisez un nombre à virgule fixe comme décimal

724voto

Xolve Points 4422

Il existe de nouvelles spécifications de format, ici :

http://docs.python.org/library/string.html#format-specification-mini-language

Vous pouvez faire la même chose :

"{0:.2f}".format(13.949999999999999)

99voto

La plupart des nombres ne peuvent pas être représentés exactement en flottants. Si vous voulez arrondir le nombre parce que c'est ce que votre formule mathématique ou votre algorithme exige, alors vous devez utiliser round. Si vous souhaitez simplement limiter l'affichage à une certaine précision, n'utilisez même pas round et formatez simplement le nombre sous la forme de cette chaîne. (Si vous voulez l'afficher avec une autre méthode d'arrondi, et il y en a des tonnes, alors vous devez mélanger les deux approches).

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

Et enfin, mais c'est peut-être le plus important, si vous voulez exact mathématiques, alors vous ne voulez pas de flotteurs du tout. L'exemple habituel est le traitement de l'argent et le stockage des "cents" sous forme d'un nombre entier.

70voto

ax003d Points 967

Essayez les codes ci-dessous :

>>> a = 0.99334
>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up
>>> print a
0.99

56voto

Greg Hewgill Points 356191

Ce que vous pouvez faire, c'est modifier le format de sortie :

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95

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