Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Math.Round rundet anders als erwartet
mygil
myCSharp.de - Member



Dabei seit:
Beiträge: 124

Themenstarter:

Math.Round rundet anders als erwartet

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Kileak
myCSharp.de - Member



Dabei seit:
Beiträge: 62

beantworten | zitieren | melden

MSDN: Math.Round(double)
Zitat
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Kileak am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo mygil,
Zitat
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
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 771

beantworten | zitieren | melden

Zitat von MSDN
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
Zitat
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Cat am .
private Nachricht | Beiträge des Benutzers
robert.wachtel
myCSharp.de - Member

Avatar #avatar-2287.gif


Dabei seit:
Beiträge: 328
Herkunft: Köln

beantworten | zitieren | melden

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

http://blog.robertsoft.de
private Nachricht | Beiträge des Benutzers
mygil
myCSharp.de - Member



Dabei seit:
Beiträge: 124

Themenstarter:

beantworten | zitieren | melden

Jetzt ist alles klar!

Vielen Dank für eure Antworten!!!
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.767
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo BerndFfm,
Zitat
... Bankers Rounding, das liest man öfter in der Literatur (Internet).
allerdings vorrangig in der englischsprachigen.
Zitat
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
private Nachricht | Beiträge des Benutzers
hinrich
myCSharp.de - Member



Dabei seit:
Beiträge: 116
Herkunft: Schleswig-Holstein

beantworten | zitieren | melden

Zitat von herbivore
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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo hinrich,
Zitat
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
private Nachricht | Beiträge des Benutzers
ikaros
myCSharp.de - Member



Dabei seit:
Beiträge: 1.739

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Uwe81
myCSharp.de - Member



Dabei seit:
Beiträge: 282
Herkunft: Ludwigshafen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Uwe81
myCSharp.de - Member



Dabei seit:
Beiträge: 282
Herkunft: Ludwigshafen

beantworten | zitieren | melden

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

private Nachricht | Beiträge des Benutzers
hinrich
myCSharp.de - Member



Dabei seit:
Beiträge: 116
Herkunft: Schleswig-Holstein

beantworten | zitieren | melden

Zitat von Uwe81
Eine spontane Umfrage unter 5 (meist promovierten) Mathematikern mit unterschiedlichen Studienorten ergab, dass niemand das mathematische Runden als solches kannte :baby:. 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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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:
Zitat
== 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
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3.331
Herkunft: Berlin

beantworten | zitieren | melden

Bitte sehr:
Zitat
... 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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von juetho am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo juetho,

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

herbivore
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3.331
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1.688

beantworten | zitieren | melden

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):
Zitat
3) 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... :D
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ujr am .
private Nachricht | Beiträge des Benutzers
trojaner
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Math.Round() Unterschiede bei double und decimal

beantworten | zitieren | melden

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.
Attachments
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
trojaner
myCSharp.de - Member



Dabei seit:
Beiträge: 20

beantworten | zitieren | melden

Vielen Dank! Ich habe auch schon vermutet, dass es an der Genauigkeit von Double liegt, aber nirgends eine konkrete Aussage dazu gefunden.
private Nachricht | Beiträge des Benutzers