Seite 1 von 1

round() befehl - Ausgabe auf Stellen beschränken

Verfasst: Donnerstag 8. September 2005, 09:19
von ABTW
Hi Ihr.
Ich lasse mir durch zwei float werte einen prozentsatz errechnen, welchen ich danach runden will. Wenn ich diesen Wert in round() einsetze, kann ich leider nur mit einem Komma getrennt sagen, bis zu welcher Stelle er runden soll. Die Ausgabe an sich bleibt aber leider so lange

Hier mein Beispiel

Code: Alles auswählen

>>> a=32.6276549
>>> a
32.627654900000003
>>> round(a,2)
32.630000000000003
gibt es ein Mittel alles nach der zweiten Kommastelle abzuschneiden? Und nicht unbedingt mir string-funktionen.
danke

Verfasst: Donnerstag 8. September 2005, 10:58
von jens
Also ich glaub nicht das es anders geht, also mit String-Operatoren... Könnte man sich evtl. einen eigenen long-Typ basteln???

Verfasst: Donnerstag 8. September 2005, 11:23
von ABTW
und wieder einmal machen skripte und die python shell unterschiedliche dinge....
im skript funktioniert es so wie da oben.... in der shell zeigt er nur interne, genaue ergebnisse

Verfasst: Donnerstag 8. September 2005, 11:42
von Leonidas
Ich habe den Thread mal nach Allgemeine Fragen verschoben.

Versuchs in der Pythonshell mit print:

Code: Alles auswählen

In [1]: a = 32.6276549

In [2]: print round(a, 2)
32.63

In [3]: print repr(round(a, 2))
32.630000000000003
Und ja auch ein Mittel zum Formatieren gibt es:

Code: Alles auswählen

In [4]: print "%0.2f" % round(a, 2)
32.63

Verfasst: Donnerstag 8. September 2005, 11:44
von jens
Aber die Frage ist, warum ist print repr(round(a, 2)) nicht 32.63 ???

Verfasst: Donnerstag 8. September 2005, 11:50
von Leonidas
Weil repr() die genaue Darstellung ist und floats in Computern allgemein ungenau sind.

Für Ungenauigkeiten ist str() zuständig :wink:

Code: Alles auswählen

In [7]: print str(round(a, 2))
32.63
Edit: gehen wir von a = 32.6276549 aus. Wenn man es mit print ausgibt, dann wird erst versucht a.__str__() aufzurufen (str(a) ruft auch a.__str__() auf), wenn das nicht geht, wird a.__repr__() versucht (repr(a) ruft passend dazu a.__repr__auf). Wenn du aber in der Interaktiven Python-Shell nur a angibst, wird sofort a.__repr__() benutzt.

Verfasst: Donnerstag 8. September 2005, 11:52
von jens
Sorry, das verstehe ich nicht, warum sollte ein round(32.6276549, 2) ein ungenaues Ergebniss haben???

Verfasst: Donnerstag 8. September 2005, 12:06
von Leonidas
Weil Computer Probleme mit Gleitkommazahlen haben.

Die Suche nach float ungenau liefert ganz schnell mal einen Thread bei mrunix, in dem das etwas erklärt wird. Genauere Infos gibt in What Every Computer Scientist Should Know About Floating-Point Arithmetic. Dies ist ein Computer-Problem, kein Python-Problem.

Verfasst: Donnerstag 8. September 2005, 13:47
von mitsuhiko
Python hat dafür einen eigenen Datentyp ;-)
import decimal und dann kannst du folgendes tun:

Code: Alles auswählen

>>> import decimal
>>> a = decimal.Decimal("35.12")
>>> b = decimal.Decimal("72.34")
>>> a + b
Decimal("107.46")
>>> c = 35.12
>>> d = 72.34
>>> c + d
107.46000000000001

Verfasst: Donnerstag 8. September 2005, 16:09
von Leonidas
blackbird hat geschrieben:Python hat dafür einen eigenen Datentyp ;-)
Hmm, das ist mal was tolles, wieder eine schöne bereicherung die man am Python 2.4 nutzen kann.

Aber in der Praxis ist float auch ausreichend, vor allem wenn man gerne mit älteren Python-Versionen kompatibel bleibt.

Verfasst: Donnerstag 8. September 2005, 16:12
von mawe
Ehrlich gesagt versteh ich nicht, wozu man Decimal braucht. Ja, mehr fällt mir dazu nicht ein :)

Verfasst: Donnerstag 8. September 2005, 16:38
von Leonidas
mawe hat geschrieben:Ehrlich gesagt versteh ich nicht, wozu man Decimal braucht.
Dokumentation des decimal Moduls hat geschrieben:The exactness carries over into arithmetic. In decimal floating point, "0.1 + 0.1 + 0.1 - 0.3" is exactly equal to zero. In binary floating point, result is 5.5511151231257827e-017. While near to zero, the differences prevent reliable equality testing and differences can accumulate. For this reason, decimal would be preferred in accounting applications which have strict equality invariants.
Wie gesagt, sehr selten kann es unter Umständen nützlich sein. Aber schön zu wissen, dass man sowas zur Verfügung hat, wenn's nötig ist.

Verfasst: Donnerstag 8. September 2005, 23:47
von BlackJack
mawe hat geschrieben:Ehrlich gesagt versteh ich nicht, wozu man Decimal braucht. Ja, mehr fällt mir dazu nicht ein :)
Braucht man zum Beispiel wenn man ernsthaft mit Geldbeträgen rechnen möchte oder eine Simulation schreibt. Bei beiden Anwendungen kann man diese, meist versteckten, Ungenauigkeiten von floats nicht gebrauchen. Die Ungenauigkeiten neigen nämlich dazu sich mit der Zeit zu addieren und bei Multiplikationen werden sie auch entsprechend grösser. Ausserdem bekommt man bei floats Probleme wenn man sehr grosse und sehr kleine Werte verrechnet und nicht möchte das die kleinen einfach unter den Tisch fallen weil die bei der Normalisierung der internen Darstellung von floats einfach verschwinden.