Python-float - str - float-Verrücktheit
>>> float(str(0.65000000000000002))
0.65000000000000002
>>> float(str(0.47000000000000003))
0.46999999999999997 ???
Was ist hier Los?
Wie kann ich umwandeln 0.47000000000000003
string-und die sich ergebenden Wert zurück zu schwimmen?
Ich bin mit Python 2.5.4 auf Windows.
- Hinzugefügt ieee-754-tag
- RC: ich denke, dass viele, viele Menschen (ja, die Programmierer auch) nicht eevn wissen, dass IEEE 754 definiert floating-point-zahlen (nicht jeder liest-Sprache-Spezifikationen :-)). Also ich würde eigentlich denken, dass die "floating-point" - tag wäre eine bessere Wahl, es sei denn, es sind bestimmte Fragen, die über den standard selbst.
- sicherlich diejenigen, die sich Fragen dieser Art von Fragen nicht wissen, was ieee-754 ist...
- war nicht bewusst, die floating-point-tag, aber sicher ist es besser als der name der Spezifikation.
Du musst angemeldet sein, um einen Kommentar abzugeben.
str(0.47000000000000003)
geben'0.47'
undfloat('0.47')
werden kann0.46999999999999997
.Dies ist aufgrund der Art, wie floating-point-Zahl dargestellt werden (siehe diese wikipedia Artikel)
Hinweis:
float(repr(0.47000000000000003))
odereval(repr(0.47000000000000003))
geben Sie das erwartete Ergebnis, aber Sie sollten Dezimal wenn Sie brauchen Präzision.float (und doppelte) haben keine unendliche Genauigkeit. Natürlich Rundungsfehler auftreten, wenn Sie mit Ihnen arbeiten.
Dies ist ein Python-FAQ
Die gleiche Frage kommt ziemlich regelmäßig in comp.lang.python auch.
Ich denke Grund ist es eine FAQ ist, dass, weil python ist perfekt in jeder anderen Hinsicht ;-), wir erwarten, dass es zu arithmetischen perfekt - genauso wie wir es in der Schule gelehrt wurden. Jedoch, wie jeder, der getan hat, eine numerische Methoden Kurs wird Ihnen sagen, die floating-point-zahlen sind eine sehr lange Weg von perfekt.
Dezimal ist eine gute alternative und wenn Sie wollen, mehr Geschwindigkeit und mehr Möglichkeiten gmpy ist auch toll.
in diesem Beispiel
Ich denke, dies ist ein Fehler in Python, wenn Sie devide
den einfachen Weg, ich dieses problem lösen, indem diese