Rechnen mit "float(str(Zahl)" ?

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.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Donnerstag 27. Juli 2006, 21:22

meinst du vlt das hier >>> print float(a)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Donnerstag 27. Juli 2006, 21:25

Ohne Zusammenhang ist das für mich bedeutungslos.
Leto
User
Beiträge: 6
Registriert: Donnerstag 27. Juli 2006, 15:23

Beitragvon Leto » Freitag 28. Juli 2006, 08:15

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?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Freitag 28. Juli 2006, 09:14

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.
Leto
User
Beiträge: 6
Registriert: Donnerstag 27. Juli 2006, 15:23

Beitragvon Leto » Freitag 28. Juli 2006, 12:34

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?
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Freitag 28. Juli 2006, 13:04

hallo,
eigendlich wollte ich nichts mehr dazu schreiben aber egal.

Code: Alles auswählen

>>> 0.12345678912345678913456789123456789123456789  #kein str
0.12345678912345678
>>>
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 28. Juli 2006, 13:20

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.

Wer ist online?

Mitglieder in diesem Forum: redone