Question

>>> float(str(0.65000000000000002))

0.65000000000000002

>>> float(str(0.47000000000000003))

0.46999999999999997     ???

Qu'est-ce qui se passe ici? Comment puis-je convertir 0.47000000000000003 à chaîne et la valeur résultante retour à flotter?

J'utilise Python 2.5.4 sous Windows.

Était-ce utile?

La solution

str(0.47000000000000003) donner '0.47' et float('0.47') peut être 0.46999999999999997. Cela est dû à la façon dont nombre à virgule flottante sont représentés (voir cette wikipedia article)

Note: float(repr(0.47000000000000003)) ou eval(repr(0.47000000000000003)) vous donnera le résultat attendu, mais vous devez utiliser décimal si vous avez besoin de précision.

Autres conseils

flotteur (et double) ne sont pas une précision infinie. Bien entendu, les erreurs d'arrondi se produisent lorsque vous utilisez sur eux.

Ceci est un Python FAQ

La même question revient tout à fait régulièrement comp.lang.python aussi.

Je pense que la raison est une FAQ est que parce que python est parfait pour tout le reste ;-), nous nous attendons à réaliser l'arithmétique parfaitement - comme nous avons appris à l'école. Cependant, comme tous ceux qui ont fait un cours de méthodes numériques vous le dira, les nombres à virgule flottante sont très loin d'être parfait.

décimal est une bonne alternative et si vous voulez plus de vitesse et plus d'options < a href = "http://gmpy.sourceforge.net/" rel = "nofollow noreferrer"> gmpy est grande aussi.

par cet exemple Je pense que cela est une erreur en Python quand on divise

    >>> print(int(((48/5.0)-9)*5))
    2

la voie facile, je résoudre ce problème par cette

    >>> print(int(round(((48/5.0)-9)*5,2)))
    3
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top