round() befehl - Ausgabe auf Stellen beschränken

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
ABTW

Donnerstag 8. September 2005, 09:19

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 8. September 2005, 10:58

Also ich glaub nicht das es anders geht, also mit String-Operatoren... Könnte man sich evtl. einen eigenen long-Typ basteln???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ABTW

Donnerstag 8. September 2005, 11:23

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 8. September 2005, 11:42

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
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 8. September 2005, 11:44

Aber die Frage ist, warum ist print repr(round(a, 2)) nicht 32.63 ???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 8. September 2005, 11:50

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.
Zuletzt geändert von Leonidas am Donnerstag 8. September 2005, 11:56, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 8. September 2005, 11:52

Sorry, das verstehe ich nicht, warum sollte ein round(32.6276549, 2) ein ungenaues Ergebniss haben???

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 8. September 2005, 12:06

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Donnerstag 8. September 2005, 13:47

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
TUFKAB – the user formerly known as blackbird
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 8. September 2005, 16:09

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 8. September 2005, 16:12

Ehrlich gesagt versteh ich nicht, wozu man Decimal braucht. Ja, mehr fällt mir dazu nicht ein :)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 8. September 2005, 16:38

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Donnerstag 8. September 2005, 23:47

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.
Antworten