Laden...

Math.Round rundet anders als erwartet

Erstellt von mygil vor 14 Jahren Letzter Beitrag vor 13 Jahren 11.044 Views
M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 14 Jahren
Math.Round rundet anders als erwartet

Hallo!

Kann mir jemand erklären, warum Math.Round so merkwürdig rundet?

z.b.:
Math.Round(2.4) Ergibt: 2.0 (war klar)
Math.Round(2.5) Ergibt: 2.0 (wahrscheinlich mathem. gerundet und nicht kaufm.)
Math.Round(2.6) Ergibt: 3.0 (war klar)

Math.Round(3.4) Ergibt: 3.0 (war klar)
Math.Round(3.5) Ergibt: 4.0 (wieso wird jetzt doch wie beim kaufm. aufgerundet?????!)
Math.Round(3.6) Ergibt: 4.0 (war klar)

Es scheint als würde es mit:
Math.Round(2.5, 0, MidpointRounding.AwayFromZero) +
Math.Round(3.5, 0, MidpointRounding.AwayFromZero)
korrekt ablaufen, kann ich dieser Rundung jetzt vertrauen oder gibts da auch irgendwelche fiesen versteckten Regeln?

Danke für eure Hilfe

K
62 Beiträge seit 2009
vor 14 Jahren

MSDN: Math.Round(double)

Rückgabewert
Der der Ganzzahl am nächsten liegende a. Wenn a genau in der Mitte zwischen zwei Ganzzahlen liegt, von denen eine gerade und die andere ungerade ist, wird die gerade Zahl zurückgegeben.

Hinweise

Das Verhalten dieser Methode entspricht dem Standard IEEE 754, Abschnitt 4. Diese Art der Rundung wird zuweilen als Rundung auf den nächsten Wert bzw. unverzerrte Rundung (Banker's Rounding) bezeichnet.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo mygil,

wieso wird jetzt doch wie beim kaufm. aufgerundet?????!

weil mathematisches Runden die .5 quasi abwechselnd auf- und abrundet. Es wird also immer mathematisch gerundet. Jedes zweite mal stimmt die mathematische Rundung dabei mit der kaufmännischen überein. Obwohl du wusstest, dass es einen Unterschied zwischen mathematischem und kaufmännischem Runden gibt, war dir offensichtlich doch nicht ganz klar, wie mathematisches Runden funktioniert. 🙂

Mit MidpointRounding kannst du zwischen mathematischem und kaufmännischem Runden umschalten. Und es funktioniert im beiden Fällen natürlich jeweils richtig.

Ich habe den Titel angepasst. Math.Round rundet nicht falsch, sondern nur anders, als du es erwartet hast.

BTW: Über die Forensuche und erst recht mit einem Blick in die :rtfm: Doku hättest du diese Informationen leicht finden können.

herbivore

771 Beiträge seit 2009
vor 14 Jahren

Rückgabewert
Der der Ganzzahl am nächsten liegende a. Wenn a genau in der Mitte zwischen zwei Ganzzahlen liegt, von denen eine gerade und die andere ungerade ist, wird die gerade Zahl zurückgegeben.

Wobei die Formulierung etwas unglücklich ist (besonders auch der 1. Satz!). Denn wann gibt es den Fall nicht, daß zwei Ganzzahlen abwechselnd gerade und ungerade sind?

Wobei auch das englische Original m.E. nicht besser ist:
http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx

The integer nearest a. If the fractional component of a is halfway between two integers, one of which is even and the other odd, then the even number is returned.

328 Beiträge seit 2006
vor 14 Jahren

Also ich halte die Definition nicht für unglücklich formuliert, sondern für wissenschaftlich exakt.

Robert Wachtel

http://blog.robertsoft.de

M
mygil Themenstarter:in
124 Beiträge seit 2009
vor 14 Jahren

Jetzt ist alles klar!

Vielen Dank für eure Antworten!!!

3.825 Beiträge seit 2006
vor 14 Jahren

Hallo mygil,

das mathematische Runden heisst auch Bankers Rounding, das liest man öfter in der Literatur (Internet).

Eine Sonderform des Rundens gibt es in der Schweiz, da werden Rechnungsbeträge auf 5 Rappen gerundet.

Und dann gibt es noch Kunden die wollen, dass immer zu ihren Gunsten gerundet wird 😉 (haben wir aber nicht realisiert)

Die schwierigste Art zu Runden ist beim Aufsplitten von Rechnungsbeträgen nach Erlöskonten mit Umrechnung brutto /netto und Rabattberechnung. Dort muss nämlich die Summe der einzelnen Buchungen mit der Gesamtsumme übereinstimmen, deshalb wird mal so mal so gerundet.

Im Mono Framework (unter Linux) funktioniert die Math.Round-Funktion übrigens nicht, die muss man da selbst programmieren. Ist aber ganz einfach.

So, das war nun alles was mir zu Thema "Round" eingefallen ist 😉

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo BerndFfm,

... Bankers Rounding, das liest man öfter in der Literatur (Internet).

allerdings vorrangig in der englischsprachigen.

das mathematische Runden heisst auch Bankers Rounding

Was mich persönlich jedes Mal stutzen lässt. Denn Banker und Kaufmänner stehen für mich gedanklich viel näher als Banker und Mathematiker. Beim Runden ist es genau umgekehrt.

Bankers Rounding == mathematisches Runden
und
kaufmännisches Runden != mathematisches Runden
also
Bankers Rounding != kaufmännisches Runden

Dazu kommt, dass ich beim Rechnen im Mathematikunterricht nicht mathematisch, sondern kaufmännisch runden musste.

Was mich alles in allem zu der Frage führt, wie Banken in Deutschland runden? Weiß das jemand (der Programme für Banken schreibt) verbindlich?

herbivore

H
116 Beiträge seit 2008
vor 14 Jahren

Dazu kommt, dass ich beim Rechnen im Mathematikunterricht nicht mathematisch, sondern kaufmännisch runden musste.

Das ist schon seit einer Stunde in meinem Kopf. Ich meine nämlich auch, dass ich damals in der Schule kaufmännisch runden musste. Das mathematische Runden ist mir zumindest in der Schule nie unter gekommen.

Ich halte auch die Aussage in der deutschsprachigen Wikipedia für falsch. Es gibt keine Zahl genau in der Mitte, da bei den reelen Zahlen 2,0 nicht ausgeschlossen ist. 2,50 ist damit genau die erste Zahl der zweiten Halbmenge, 2,49 die letzte der ersten, wobei beide Teilmengen (in diesem Beispiel) aus 50 Zahlen bestehen.

Ich kann da auch keinen systematischen Fehler erkennen. Dieses würde erst auftreten, wenn man 3,0 in die Betrachtung einbeziehen würde, was jedoch aus meiner Sicht systematisch falsch wäre. offensichtlich aber die Grundlage dieser Überlegung zu sein scheint. Dann ist natürlich eine Rundungsverfahren notwendig, welches den falschen Systemansatz wieder ins Lot bringt.

Völlig verwirrt,
Hinrich

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo hinrich,

Es gibt keine Zahl genau in der Mitte, da bei den reelen Zahlen 2,0 nicht ausgeschlossen ist.

also ich würde das arithmetische Mittel von zwei Zahlen als die Zahl ansehen, die genau in der Mitte zwischen ihnen liegt. Und das wäre bei 2,0 und 3,0 eben genau 2,5.

herbivore

I
1.739 Beiträge seit 2005
vor 14 Jahren

Hinzufüg:
Beim mathematischen Runden(was eine Klasse namens Math auch tunlichst verwenden sollte) wird auf die nächstgelegene Zahl gerundet. Liegt der Wert im Mittel zwischen zwei Zahlen(also x.5) wird auf die gerade Zahl gerundet.
Soweit die Definition für mathematisches Runden.

U
282 Beiträge seit 2008
vor 14 Jahren

Meines Wissens (bin immerhin Mathematiker) wird in der Mathematik eine Zahl genau dann auf die natürliche Zahl n gerundet, wenn sie im halboffenen Intervall [n-0.5, n+0.5) liegt. Das spielt auch praktisch für reelle Zahlen keine Rolle, weil Werte wie "exakt 7.5" selten vorkommen, u.A. nach jeder stetigen Verteilung mit Wahrscheinlichkeit 0 auftreten. Daher macht man sich wenig Gedanken, wie dort gerundet wird.

Im Kaufmännischen ist das ganze viel Wichtiger. Denn dort werden eben keine stetigen Verteilungen angenommen, sondern meist rechnet man mit auf Zahlen, due nach dem Komma zwei stellen habe (oder mehr, aber jedenfalls recht wenige). Wenn ich nun lauter Beträge habe, die auf zwei Stellen nach dem Komma genau sind, und diese mathematisch runde (also ab 7.50 auf 8 runden), dann erhöhe ich den Betrag im Schnitt um 0.005 Cent.

Anschaulich: Ich habe eine Liste mit 1000 Beträgen, die jemand mir Zahlen muss. Wenn ich nun alle diese Beträge auf Euro runde, sollte ich am Ende im Erwartungswert denselben Betrag erhalten (das wird natürlich zufällig streuen, aber es sollte keine systematische Tendenz in eine Richtung geben).

Bei kaufmännischem Runden (bei 0.5 auf die gerade Zahl) ist das so.
Bei mathematischem Runden (bei 0.5 aufrunden) würde ich im Erwartungswert jedesmal 0.005 Cent, in der Summe also 5 Euro gewinnen.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Uwe81,

deine Überlegungen sind an sich schlüssig. Nur leider sind die Bezeichnungen nunmal genau umgekehrt festgelegt. Also das mathematische Runden ist das auf die gerade Endziffer. Und das kaufmännische Runden ist das, wo bei 0,5 immer aufgerundet wird.

Siehe auch http://de.wikipedia.org/wiki/Rundung

herbivore

U
282 Beiträge seit 2008
vor 14 Jahren

deine Überlegungen sind an sich schlüssig. Nur leider sind die Bezeichnungen nunmal genau umgekehrt festgelegt. Also das mathematische Runden ist das auf die gerade Endziffer. Und das kaufmännische Runden ist das, wo bei 0,5 immer aufgerundet wird.

Ok, ich sehe ein, dass es bei Wikipedia anders steht. Eine spontane Umfrage unter 5 (meist promovierten) Mathematikern mit unterschiedlichen Studienorten ergab, dass niemand das mathematische Runden als solches kannte 🤔. Zumindest scheint diese Definition also nicht allgemein Verbreitet zu sein.

H
116 Beiträge seit 2008
vor 14 Jahren

Eine spontane Umfrage unter 5 (meist promovierten) Mathematikern mit unterschiedlichen Studienorten ergab, dass niemand das mathematische Runden als solches kannte 👶. Zumindest scheint diese Definition also nicht allgemein Verbreitet zu sein.

Wie schön, dass ich nicht alleine darstehe. Immerhin habe ich keine Mathematik studiert, sondern nur so'n langweiliges BWL. Aber an dem Begriff mathematisches Runden störe ich mich dennoch. Wikipedia (zumindest die deutsche Ausgabe, nicht aber die englische Fassung) spricht zwar vom mathematischen Runden, aber Microsoft spricht in seiner Hilfe lediglich vom Standard IEEE 754. Die englische Fassung von Wikipedia bezeichnet das Round half up als mathematisches Runden, wobei dort eine fehlende Fußnote bemängelt wird. Das Runden nach IEEE 754 (half to even) wird als unbiased rounding, convergent rounding, statistician's rounding, Dutch rounding, Gaussian rounding, or bankers' rounding bezeichnet, nicht aber als mathematisches Runden.

Ich würde den Artikel der deutschen Wikipedia insofern als fehlerhaft einstufen.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo zusammen,

der Begriff mathematisches Runden wurde bei Wikipedia in der Version "09:08, 30. Mär. 2007" (und der Version eine Minute später) eingeführt und hat sich seit dem gehalten.

Interessant dabei ist, dass der Begriff an den drei Stellen, wo er eingefügt wurde, immer leicht unterschiedlich benutzt wurde:

== Unverzerrte oder Mathematische Rundung ==
...
Kaufmännisches und unverzerrtes mathematisches Runden unterscheiden sich ...
...
Es gibt ein Verfahren, das diese Probleme vermeidet, die ''mathematisch unverzerrte Rundung''

Der Begriff wurde jedoch auch nie in Frage gestellt. Ich habe alle Versionen der Diskussionseite seit kurz vor der Änderung des Artikels durchgesehen. Auf der Diskussionsseite wird im Gegenteil der Begriff "mathematische Rundung" wie selbstverständlich aufgegriffen und sogar mit dem "Taschenbuch der Mathematik" kurz "Bronstein" in Verbindung gebracht. Vielleicht kann einer, der das Buch hat, mal dort nachgucken.

Ich selber kann mich nicht verlässlich erinnern, wann ich die das Runden auf gerade Zahlen kennengelernt habe und wann und wo ich die Bezeichnung mathematisches Runden zum ersten mal gehört habe. Ich bin mir nur sicher, dass das Runden, das 0,5 immer aufrundet, allgemein als kaufmännisches Runden bezeichnet wird.

herbivore

J
3.331 Beiträge seit 2006
vor 14 Jahren

Bitte sehr:

... dabei wird die letzte stehenbleibende Ziffer um eine Einheit erhöht, wenn die erste wegfallende Ziffer größer als 4 ist. Besteht der wegzulassende Teil nur aus der einen Ziffer 5, dann rundet man so, dass die letzte stehenbleibende Ziffer eine gerade Zahl ergibt... Quelle: Bronstein, Taschenbuch der Mathematik, Leipzig 1969, S. 97 (Hervorhebung von mir)

Gruß Jürgen

PS. Meine Ausgabe ist zwar schon ein paar Monate älter, aber das zeigt eher, dass diese Regelung nicht neu ist, sondern eher als selbstverständlich angesehen wurde.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo juetho,

wie wird diese Art der Rundung im Bronstein genannt? Wird dort nur diese eine Art der Rundung beschrieben?

herbivore

J
3.331 Beiträge seit 2006
vor 14 Jahren

Hallo herbivore,

es ist nur ein Absatz "Rundungen" innerhalb von: Teil II Elementarmathematik - 1. Näherungsrechnung - 1.1 Regeln für das Rechnen mit Näherungswerten. Es wird nur diese eine Art der Rundung beschrieben (ohne einen Namen dafür), allerdings mit Hinweis auf dabei auftretende Ungenauigkeiten und Fehler. Der Plural bezieht sich vermutlich darauf, dass es eine häufiger vorkommende Situation betrifft, aber nicht auf verschiedene Rundungsverfahren.

Mein o.g. Zitat umfasst etwa 3 Zeilen von insgesamt gut 9 Zeilen Text.

Jürgen

U
1.688 Beiträge seit 2007
vor 14 Jahren

Hallo,

meine Ausgabe ist 10 Jahre jünger. Dort steht dann unter "Rundungsregeln" (ohne nähere Bezeichnung, was doch impliziert, dass (in der Mathematik) keine andere Regel benutzt wird):

  1. Folgt auf die letzte beizubehaltende Ziffer lediglich eine 5 oder eine 5, auf die nur Nullen folgen, so wird abgerundet, falls die letzte beizubehaltende Ziffer einen geraden Ziffernwert besitzt, sonst wird aufgerundet.

Ich kann mich auch nicht erinnern, jemals anders gerundet zu haben... 😁

T
20 Beiträge seit 2007
vor 13 Jahren
Math.Round() Unterschiede bei double und decimal

Hallo,

ich habe jetzt einige Zeit im Internet verbracht um eine Antwort auf meine Frage zu finden, leider ohne Erfolg. Vielleicht kann mir einer von euch helfen.

Im Prinzip verstehe ich nicht, warum die Methode Math.Round(), bei den Datentypen double und decimal, unterschiedliche Ergebnisse zurück liefert, siehe Dateianhang.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo trojaner,

die Ausgaben für die decimal-Werte sind korrekt. Da wo das Ergebnis der double-Berechnung nicht damit übereinstimmt, wird das daran liegen, dass schon bei binären Repräsentation der Ausgangszahl ein Rundungsfehler aufgetreten ist (siehe [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler). 1182.285 als doube repräsentiert wird einfach einen winzigen Tick größer sein (vielleicht 1182.28500000001) und deshalb aufgerundet statt abgerundet werden.

herbivore

T
20 Beiträge seit 2007
vor 13 Jahren

Vielen Dank! Ich habe auch schon vermutet, dass es an der Genauigkeit von Double liegt, aber nirgends eine konkrete Aussage dazu gefunden.