Limitation des flottants à deux décimales

Je veux que a soit arrondi à 13.95.

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

La fonction [round][1] ne fonctionne pas comme je l'attendais.

[1] : https://docs.python.org/2/library/functions.html#round

Vous rencontrez le [vieux problème] (https://en.wikipedia.org/wiki/IEEE_754) avec les nombres à virgule flottante : tous les nombres ne peuvent pas être représentés exactement. La ligne de commande ne fait que vous montrer la forme complète de la virgule flottante de mémoire.

Avec la représentation en virgule flottante, votre version arrondie est le même nombre. Les ordinateurs étant binaires, ils stockent les nombres à 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 en 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 type de 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 (pour afficher une valeur monétaire, par exemple), vous avez deux meilleurs choix :

  1. Utilisez des nombres entiers et stockez les valeurs en cents, et non en dollars, puis divisez par 100 pour convertir en dollars.
  2. Ou utilisez un nombre à virgule fixe comme [decimal][1].

[1] : https://docs.python.org/library/decimal.html

Commentaires (13)

Vous pouvez modifier le format de sortie :

>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Commentaires (0)

Il fait exactement ce que vous lui avez demandé et fonctionne correctement. Lisez davantage sur la [confusion en virgule flottante][1] et essayez plutôt les objets [décimaux][2].

[1] : http://www.lahey.com/float.htm [2] : http://docs.python.org/library/decimal.html

Commentaires (0)