Question

Voici un exemple:

>>> "%.2f" % 0.355
'0.35'
>>> "%.2f" % (float('0.00355') *100)
'0.36'

Pourquoi ils donnent des résultats différents?

Était-ce utile?

La solution

Ce n'est pas un bug de format. Ceci est juste l'arithmétique en virgule flottante. Regardez les valeurs de vos commandes de la superposer au format:

In [18]: float('0.00355')
Out[18]: 0.0035500000000000002

In [19]: float('0.00355')*100
Out[19]: 0.35500000000000004

In [20]: 0.355
Out[20]: 0.35499999999999998

Les deux expressions créent des valeurs différentes.

Je ne sais pas si elle est disponible en 2.4 mais vous pouvez utiliser le module décimal pour faire ce travail:

>>> import decimal
>>> "%.2f" % (decimal.Decimal('0.00355')*100)
'0.35'

Le module traite décimaux flotte comme des chaînes pour maintenir une précision arbitraire.

Autres conseils

Parce que, comme tous virgule flottante « inexactitude » des questions, tous les nombres réels peuvent être représentés dans un nombre limité de bits.

Même si nous devions aller de noix et avoir des formats à virgule flottante 65536 bits, le nombre de nombres compris entre 0 et 1 est encore, ... eh bien, infini: -)

Qu'est-ce qui se passe presque certainement est que le premier est légèrement ci-dessous 0,355 (par exemple, ,3549999999999) tandis que le second est légèrement ci-dessus (par exemple, 0,3550000001).

Voir pour une lecture plus sur le sujet.

Un bon outil pour jouer avec pour voir comment les nombres à virgule flottante travail est excellente de Harald Schmidt sur Convertisseur -ligne . C'était si pratique, je fait mon propre un mis en œuvre C # ainsi, capable de gérer à la fois simple IEEE754 et double précision.

Arithmétique avec nombres à virgule flottante est souvent imprécis.

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top