Runden muss man können
Habt ihr gewusst, dass Math.Round nicht nach dem Standard-Schulverfahren rundet, wie man es aus der Grundschule kennt, sondern nach dem Standard IEEE 754, Abschnitt 4? Das ist das sogenannte „Banker’s Rounding“ und funktioniert so, dass bei Werten die genau in der Mitte stehen (z.B. 1,5), die Werte nicht generell aufgerundet werden, sondern nur dann aufgerundet werden, wenn der Wert davor ungerade ist. Bei geraden Werten wird der Rest einfach abgeschnitten und somit abgerundet.
Beispiel:
Math.Round(1.5,0); // = 2
Math.Round(2.5,0); // = 2
Somit kann der allgemeine Rundungsfehler, der sich normalerweise immer nur nach oben ausdehnt, fast komplett ausgeglichen werden. Ich muss zugeben, dass dieses Verhalten etwas gewöhnungsbedürftig ist. Wenn man das Verhalten so haben möchte, wie man es aus der Grundschule kennt, dann gibt es einen kleinen weiteren Parameter in der Round-Methode, die dann wieder ordentlich rundet.
Math.Round(1.5,0, MidpointRounding.AwayFromZero) //=2
Math.Round(2.5,0, MidpointRounding.AwayFromZero) //=3