Seite 1 von 2

Verfasst: Donnerstag 27. Juli 2006, 21:22
von pyStyler
meinst du vlt das hier >>> print float(a)

Verfasst: Donnerstag 27. Juli 2006, 21:25
von birkenfeld
Ohne Zusammenhang ist das für mich bedeutungslos.

Verfasst: Freitag 28. Juli 2006, 08:15
von Leto
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?

Verfasst: Freitag 28. Juli 2006, 09:14
von Rebecca

Code: Alles auswählen

>>> str(0.123456789123456789123456789)
'0.123456789123'
str rundet immer auf die gleiche Anzahl Nachkommastellen genau (nach obigem Beispiel scheinen es 12 Nachkommastellen zu sein).

Code: Alles auswählen

>>> 0.3
0.29999999999999999
>>> str(0.29999999999999999)
'0.3'
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.

Verfasst: Freitag 28. Juli 2006, 12:34
von Leto
Na jetzt hab ichs (hoffentlich).

Wär mal interessant zu wissen, warum str denn an der 12 Stelle kürzt. Gibt es dafür irgendeinen logischen/technischen Hintergrund?

Verfasst: Freitag 28. Juli 2006, 13:04
von pyStyler
hallo,
eigendlich wollte ich nichts mehr dazu schreiben aber egal.

Code: Alles auswählen

>>> 0.12345678912345678913456789123456789123456789  #kein str
0.12345678912345678
>>> 

Verfasst: Freitag 28. Juli 2006, 13:20
von birkenfeld
pyStyler hat geschrieben:hallo,
eigendlich wollte ich nichts mehr dazu schreiben aber egal.

Code: Alles auswählen

>>> 0.12345678912345678913456789123456789123456789  #kein str
Das ist sehr wohl ein String, solange bis er eingelesen und von Python zu einem Float konvertiert wurde.

Code: Alles auswählen

0.12345678912345678
Und genauso ist das ein String. Eine Konsole kann keine Zahlen ausgeben, nur Text. Zahlen müssen in Text konvertiert werden.

Und um Floats in Strings zu konvertieren, gibt es eben in Python zwei Möglichkeiten: str() und repr(). str() rundet auf 12 Nachkommastellen, repr() auf 17.