Question Limitation des flotteurs à deux décimales


je veux a être arrondi à 13,95.

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

le round La fonction ne fonctionne pas comme je l'espérais.


1118
2018-01-18 18:16


origine


Réponses:


Vous rencontrez l'ancien problème avec des nombres à virgule flottante que tous les nombres ne peuvent pas être représentés. La ligne de commande ne fait que vous montrer le formulaire à virgule flottante depuis la mémoire.

En virgule flottante, votre version arrondie est le même nombre. Puisque les ordinateurs sont binaires, ils stockent des nombres à virgule flottante sous la forme d'un nombre entier, puis le divisent par une puissance de deux, de sorte que 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 flotteurs normaux ont 24 bits (8 chiffres) de précision. le virgule flottante en Python utilise une 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 êtes après seulement deux décimales comme dans la devise alors vous avez un couple de meilleurs choix: 1) Utilisez des entiers et stockez des valeurs en cents, pas en dollars, puis divisez par 100 pour convertir en dollars. 2) Ou utilisez un nombre à virgule fixe comme décimal.


1154
2018-01-18 18:23



Il y a de nouvelles spécifications de format, Spécification de format de chaîne Mini-langue:

Vous pouvez faire la même chose que:

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

Remarque que ce qui précède renvoie une chaîne. Afin d'obtenir le flotteur, envelopper simplement avec float(...):

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

Remarque cet emballage avec float() ne change rien

>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{0:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True

423
2018-06-30 18:53



Le built-in round() fonctionne très bien dans Python 2.7 ou plus tard.

Exemple:

>>> round(14.22222223, 2)
14.22

Check-out La documentation.


138
2017-12-31 10:51



Je pense que l'approche la plus simple consiste à utiliser le format() fonction.

Par exemple:

a = 13.949999999999999
format(a, '.2f')

13.95

Cela produit un nombre flottant sous la forme d'une chaîne arrondie à deux décimales.


118
2018-01-25 22:26



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

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

Et enfin, mais peut-être le plus important, si vous voulez exact maths alors vous ne voulez pas de flotteurs du tout. L'exemple habituel traite de l'argent et de stocker des «cents» en entier.


85
2018-01-18 18:40



Essayez le code ci-dessous:

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

65
2017-08-26 06:46



Avec Python <3 (par exemple 2.6 ou 2.7), il y a deux façons de le faire.

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

# Option two (note ':' before the '.9f')
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 suggère ce lien sur formatage de chaîne à 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éférence: Convertir le nombre à virgule flottante en une certaine précision, puis copier en chaîne


49
2017-12-11 06:37