>>> float(str(0.65000000000000002)) 0.65000000000000002 >>> float(str(0.47000000000000003)) 0.46999999999999997 ??? What is going on here? How do I convert 0.47000000000000003 to string and the resultant value back to float?I am using Python 2.5.4 on Windows.
4 Réponses :
float (et double) n'a pas de précision infinie. Naturellement, des erreurs arrondies se produisent lorsque vous les opérez. P>
Remarque: str (0.47000000000000003) code> donne
'0.47' code> et
float ('0.47') code> peut être
0.46999999999999997 CODE>.
Cela est dû à la façon dont le nombre de points flottants est représenté (voir cette Wikipedia article) P>
float (REC (0.47000000000000003)) code> ou
eval (REC (0.47000000000000003)) code> vous donnera le résultat attendu, mais vous devez utiliser Decimal Si vous avez besoin de précision. P>
Remarque: Utilisez décimal ici non seulement pour la précision, mais aussi pour une exactitude.
Je ne suis pas sûr, mais je perçois "précision" et "exactitude" comme synonymes, la précision étant le terme habituel.
Voir en.wikipedia.org/wiki/precision_vs._accurat - Les chiffres discutés sont très précis mais le problème discuté est qu'ils sont inexacts.
Ceci est un Python FAQ P>
La même question apparaît assez régulièrement dans comp.lang.python aussi. p>
Je pense que la raison est une FAQ, c'est que parce que Python est parfait dans tous les autres égards ;-), nous nous attendons à ce qu'il effectue parfaitement l'arithmétique - comme nous avons été enseignés à l'école. Cependant, comme quiconque qui a fait une méthode numérique, le cours vous dira, les numéros de points flottants sont très parfaits de parfait. P>
décimal est une bonne alternative et si vous voulez plus de vitesse et plus d'options < un href = "http://gmpy.sourceforge.net/" rel = "nOfollow noreferrer"> GMPY est génial aussi. P>
par cet exemple
Je pense que ceci est une erreur dans Python lorsque vous dévier le moyen facile, je résous ce problème par ce problème P>
RC: Je pense que beaucoup de gens (oui, programmeurs aussi) ne savent pas que IEEE 754 définit les numéros de points flottants (tout le monde ne lit pas les spécifications de langue :-)). Je pense donc que l'étiquette "Point flottant" serait un meilleur choix à moins de questions spécifiques sur la norme elle-même.
Ceux qui posent ce type de questions ne savent pas ce que IEEE-754 est ...
N'était pas au courant de la balise à point flottant mais sûre que c'est mieux que le nom de la spécification.