Implizite Ausgabe von Listen, welche floats enthalten

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.
Antworten
weasel
User
Beiträge: 5
Registriert: Sonntag 8. Februar 2009, 20:52

Ist im Moment kein Problem, was mich am Weiterprogrammieren hindert, jedoch hätte ich gerne schon eine Erklärung für folgendes Verhalten. Vielleicht hat ja jemand eine Idee, welche ich bisher nicht mittels Suche im Forum, oder einer Suchmaschine auftun konnte.

Code: Alles auswählen

mylist = [113.189, 134.299, 345.289, 244.332, 532.002]

print "Eigene Ausgabe:"
for zahl in mylist: 
   print zahl

print "implizite Ausgabe:"
print mylist
Und nun die Ausgabe

Code: Alles auswählen

Eigene Ausgabe:
113.189
134.299
345.289
244.332
532.002
implizite Ausgabe:
[113.18899999999999, 134.29900000000001, 345.28899999999999, 244.33199999999999, 532.00199999999995]
Wendet hier die print Methode der Liste eine bestimmte Ausgabeform an, bzw, weshalb "rundet" diese Ausgabe dann auf so krumme Zahlen?

Grübelnde Grüße
Weasel
BlackJack

Verantwortlich ist die `__str__()`-Methode der Liste, die zur Darstellung `repr()` auf den Elementen aufruft, um sie in Zeichenketten umzuwandeln. Und nicht `__repr__()` von Fliesskommazahlen rundet komisch, sondern `__str__()` auf Fliesskommazahlen rundet für die Anzeige.

Code: Alles auswählen

In [233]: a = 0.1

In [234]: print str(a)
0.1

In [235]: print repr(a)
0.10000000000000001
Die Listendarstellung bzw. `repr()` ist näher an der Realität. Wie man zum Beispiel sieht kann der Rechner 1/10tel nicht exakt als Fliesskommazahl speichern! Auch wenn ``print a`` einen scheinbar in Sicherheit wiegt.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das sind keine "krummen Zahlen", sondern die mit denen Python intern arbeitet, denn Floats lassen sich nicht immer glatt darstellen, aber auf die Mechanismen dahinter will ich jetzt nicht eingehn. Das führt zu weit.

Dein Problem geht darauf zurück, dass du im ersten Fall `print` auf die Werte anwendest und im 2. Fall auf die Liste, die für ihren Inhalt wiederum `repr` aufruft.
weasel
User
Beiträge: 5
Registriert: Sonntag 8. Februar 2009, 20:52

Erst einmal vielen Dank Euch beiden. Ihr habt mir doch wieder auf die Sprünge geholfen.
cofi hat geschrieben:Das sind keine "krummen Zahlen", sondern die mit denen Python intern arbeitet, denn Floats lassen sich nicht immer glatt darstellen, aber auf die Mechanismen dahinter will ich jetzt nicht eingehn. Das führt zu weit.
Stimmt ja, dass die rechnerinterne Repräsentation von Gleitkommazahlen eine andere ist, als im dekadischen System, welches man auf dem Papier anwendet. Irgendwann wusste ich das auch schon mal. ;-) Für all jene, die es bisher noch nicht wussten, oder mal wieder ihr Wissen auffrischen wollen, sei auf die Schnelle dieser Artikel empfohlen, welcher die Frage klärt, weshalb man nie 2 Gleitkommazahlen direkt miteinander vergleichen sollte http://www.michael-puff.de/Artikel/Fliesskomma.shtml

Danke und Gruß
Weasel
Antworten