python2.4.3: bug de format?
-
26-10-2019 - |
Question
Voici un exemple:
>>> "%.2f" % 0.355
'0.35'
>>> "%.2f" % (float('0.00355') *100)
'0.36'
Pourquoi ils donnent des résultats différents?
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