Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Also mir ist schon klar, dass (0.3-0.1) und 0.2 in Python nicht gleich sind.
ich verstehe nur nicht, warum str(0.3-0.1) auf einmal '0.2' ist.
Wird da gerundet? Und wenn ja, an welcher Stelle bzw. nach welchem System?
Leto hat geschrieben:Also mir ist schon klar, dass (0.3-0.1) und 0.2 in Python nicht gleich sind.
ich verstehe nur nicht, warum str(0.3-0.1) auf einmal '0.2' ist.
Wird da gerundet? Und wenn ja, an welcher Stelle bzw. nach welchem System?
Um hier mal Klarheit zu schaffen:
Floats sind nicht nur in Python ungenau. Sie sind überall ungenau, weil das nicht anders geht, wenn man dezimale Zahlen in einem Binärsystem mit einer begrenzten Anzahl von Stellen repräsentiert. (Deswegen gibts ja auch das decimal-Modul).
Bei Anwendung von str() auf einen float wird auf 12 Stellen, bei repr() auf 17 Stellen "gerundet". Eventuelle Nullen am Ende werden dann entfernt. Das führt dazu, dass die Ausgabe von
>>> 0.3-0.1
0.1999...
anders aussieht als von
>>> print 0.3-0.1
0.2
da print str() verwendet, das Prompt an sich aber repr().
birkenfeld hat geschrieben:
Bei Anwendung von str() auf einen float wird auf 12 Stellen, bei repr() auf 17 Stellen "gerundet". Eventuelle Nullen am Ende werden dann entfernt. Das führt dazu, dass die Ausgabe von
>>> x=str(0.3)
>>> type(x)
<type 'str'>
>>> y=float(x)
>>> type(y)
<type 'float'>
>>>
>>> x
'0.3'
>>> y
0.29999999999999999
>>>
Was soll das jetzt beweisen? Indem du float("0.3") ausführst, hast du wieder einen Float. Keinen String. Wenn du diesen am Interpreterprompt direkt anzeigen lässt (also via repr()), wird die Ungenauigkeit deutlich. Nochmal: Es gibt keine Möglichkeit für den Computer, die 0.3 als Float exakt zu speichern.
Sorry, aber noch hab ich nichts gerafft.
Das sind mir doch ein paar Aussagen zu viel (und scheinbar so widersprüchlich).
1. Mir ist schon klar, warum eine Zahl wie 0.3 binär nicht exakt dargestellt werden kann.
2. Mir ist auch klar warum das für z.b für 0.5 geht.
3. Mir ist ebenso klar, dass durch diese Ungenauigkeit ein Rechenfehler bei '0.3-01' auftritt, so dass das Ergebnis ungleich 0.2 ist.
4. Mir war nur eben nicht klar, warum str(0.3-0-1) auf einmal '0.2' ist.
Gut scheinbar wird da gerundet (das mit dem 'Nullen wegstreichen' war ja wohl überflüssig, immerhin reden wir von floatingpoint und nicht von fixedpoint).
Nur nach welchem System? An welcher Kommastelle? Woher weiß Python denn, wann gerundet werden soll und wann eine Zahl wie 0.19999999999999998 das tatsächlich erwartete Ergebnis darstellt?
0.29999999999999999 auf 12 Stellen gerundet ist nunmal 0.300000000000 (wenn ich mich jetzt nicht verzaehlt habe). str() ist dann noch so schlau, die ueberfluessigen Nullen am Ende wegzulassen.
D.h. Python weiss ueberhaupt nichts von "exakt". Fuer den Computer sind diese Maschinenzahlen alle exakt.