Decimal richtig runden

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
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo zusammen,

bis gerade eben hätte ich eigentlich gedacht, ich hätte das Thema Runden geschnallt, aber jetzt wurde ich eines besseren belehrt :-) Ich möchte einen als Decimal gespeicherten Euro-Betrag folgendermaßen auf 2 Nachkommastellen runden:

Code: Alles auswählen

from decimal import *
betrag=Decimal("21.0349")
print betrag.quantize(Decimal('.01'), rounding=ROUND_HALF_UP)
ergibt aber

21,03 statt 21,04

Kann mir jemand sagen, was ich hier falsch mache?

Vielen Dank!
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

andi24 hat geschrieben:Kann mir jemand sagen, was ich hier falsch mache?
Du denkst falsch. Das Ergebnis ist völlig korrekt. 21,0349 auf zwei Stellen gerundet ist 21,03. Erst ein Wert von mindestens 21,035 ergäbe 21,04.

Wenn du immer aufrunden willst, dann benötigst du ROUND_UP und nicht ROUND_HALF_UP.
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo \me,

generell aufrunden möchte ich nicht, aber wenn ich 21,0349 von rechts her runde wird ja erstmal 21,035 draus und dann eben am Ende 21,04 ... so lang mich da jetzt meine Mathematik nicht im Stich lässt :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

andi24 hat geschrieben: generell aufrunden möchte ich nicht, aber wenn ich 21,0349 von rechts her runde wird ja erstmal 21,035 draus und dann eben am Ende 21,04 ... so lang mich da jetzt meine Mathematik nicht im Stich lässt :-)
Seit wann rundet man sukzessive? Man guckt sich doch eigentlich nur die Ziffer nach der letzten beizubehaltenden Ziffer an...
Zuletzt geändert von Hyperion am Freitag 27. Januar 2012, 13:12, insgesamt 1-mal geändert.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Ok, dann hatte ich da wohl einen Denkfehler.

Vielen Dank euch beiden und ein schönes Wochenende!
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

\me hat geschrieben:Du denkst falsch. Das Ergebnis ist völlig korrekt. 21,0349 auf zwei Stellen gerundet ist 21,03. Erst ein Wert von mindestens 21,035 ergäbe 21,04
Stimmt nur für das kaufmännische Runden. Beim mathematischen Runden hat der OP schon recht.

EDIT: Oops ... hat er doch nicht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Rekrul hat geschrieben: Stimmt nur für das kaufmännische Runden. Beim mathematischen Runden hat der OP schon recht.
Bist Du Dir sicher? Ich zitiere mal wikipedia:
wikipedia (Rundung: Mathematische Rundung) hat geschrieben: Kaufmännisches und unverzerrtes mathematisches Runden unterscheiden sich nur darin, wohin eine Zahl genau in der Mitte zwischen zwei Zahlen mit der gewählten Anzahl von Dezimalziffern gerundet wird.
Wir haben hier ja keine "5"...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten