2009-11-22 8 views
8
>>> float(str(0.65000000000000002)) 

0.65000000000000002 

>>> float(str(0.47000000000000003)) 

0.46999999999999997  ??? 

Was ist hier los? Wie konvertiere ich 0.47000000000000003 in String und den resultierenden Wert zurück in float?Python float - str - float merkwürdigkeit

Ich verwende Python 2.5.4 unter Windows.

+1

hinzugefügt IEEE-754-Tag –

+3

RC: Ich denke, dass viele Leute (ja, auch Programmierer) nicht wissen, dass IEEE 754 Fließkommazahlen definiert (nicht jeder liest Sprachspezifikationen :-)). Also würde ich eigentlich denken, dass das "Fließkomma" -Tag eine bessere Wahl wäre, wenn es nicht spezifische Fragen über den Standard selbst gibt. – Joey

+5

sicherlich diejenigen, die diese Art von Fragen stellen wissen nicht, was ieee-754 ist ... – sth

Antwort

16

str(0.47000000000000003) geben '0.47' und float('0.47') kann 0.46999999999999997 sein. Dies ist aufgrund der Art und Weise Gleitkommazahl dargestellt (siehe diesen Artikel wikipedia)

Hinweis: float(repr(0.47000000000000003)) oder eval(repr(0.47000000000000003)) wird Ihnen das erwartete Ergebnis, aber Sie sollten Decimal verwenden, wenn Sie Präzision benötigen.

+0

Danke, gut zu wissen! – Sharun

+0

Hinweis: Verwenden Sie Dezimal hier nicht nur für die Genauigkeit, sondern auch für die Genauigkeit. – Joey

+0

Ich bin mir nicht sicher, aber ich nehme "Präzision" und "Genauigkeit" als Synonyme wahr, Genauigkeit ist die übliche Bezeichnung. – tzot

3

float (und double) haben keine unendliche Genauigkeit. Natürlich treten Rundungsfehler auf, wenn Sie mit ihnen arbeiten.

2

Dies ist ein Python FAQ

Die gleiche Frage auch auf quite regularly in comp.lang.python kommt.

Ich denke, Grund ist, dass es eine FAQ ist, weil Python in allen anderen Aspekten perfekt ist ;-), wir erwarten, dass es perfekt arithmetisch funktioniert - genau wie wir es in der Schule gelernt haben. Wie jedoch jeder, der einen numerischen Methodenkurs gemacht hat, Ihnen sagen wird, sind Fließkommazahlen vom perfekten Weg sehr weit entfernt.

Decimal ist eine gute Alternative und wenn Sie mehr Geschwindigkeit und mehr Optionen wollen gmpy ist auch toll.

0

durch dieses Beispiel Ich denke, dies ist ein Fehler in Python ist, wenn Sie

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

der einfache Weg devide, das ich lösen dieses Problem, indem dieses

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