Rundung in C# (und PHP) 👍 👎

Rundung erscheint auf den ersten Blick so selbstverständlich, dass so mancher geneigt scheint, sich darüber gar keine großen Gedanken zu machen. Beim Ab- und Aufrunden mit Methoden wie Math.Floor und Math.Ceiling gibt es auch tatsächlich keine großen Überraschungen bei den meisten Programmiersprachen:
Auf- und Abrunden
010203040506070809
  // Abrundungdouble floor1 = Math.Floor(1.3);  // 1double floor2 = Math.Floor(1.5);  // 1double floor3 = Math.Floor(1.7);  // 1  // Aufrundungdouble ceiling1 = Math.Ceiling(1.3);  // 2double ceiling2 = Math.Ceiling(1.5);  // 2double ceiling3 = Math.Ceiling(1.7);  // 2
Spannend wird es jedoch beim allgemeineren Rundungsverfahren mit Math.Round, bei welchem sich das Verhalten standardmäßig zu dem unterscheiden kann, was man beispielsweise aus der Schule als kaufmännisches Runden oder vom Standardverhalten von round aus PHP kennt. Der Unterschied liegt konkret beim Rundungsverhalten an der Ziffer 5:
Rundungsverhalten an der Ziffer "5"
01020304050607
double rounded11 = Math.Round(2.3);  // 2double rounded12 = Math.Round(2.5);  // 2 (!)double rounded13 = Math.Round(2.7);  // 3
double rounded21 = Math.Round(7.3); // 7double rounded22 = Math.Round(7.5); // 8double rounded23 = Math.Round(7.7); // 8
Die Ursache für dieses für manche möglicherweise überraschende Verhalten liegt darin begründet, dass bei C# das mathematische Rundungsverfahren zur Anwendung kommt, welches in so einem Fall standardmäßig die Rundung zur nächsten geraden Ziffer vorschreibt, anstatt pauschal aufzurunden. Das Anliegen dabei ist es, statistische Verzerrungen durch ausschließliches Aufrunden an dieser Stelle zu vermeiden. Dies ist in jedem Fall bei der Interoperabilität mit anderen Systemen, die auf eine gleiche Datenbasis zugreifen, zu berücksichtigen.

Sowohl bei C# als auch bei PHP lässt sich dieses Verhalten jedoch manuell anpassen (und dadurch nötigenfalls angleichen), indem man unter C# einen Wert der Enumeration MidpointRounding oder unter PHP eine der Konstanten PHP_ROUND_HALF_* an die entsprechende Methode/Funktion zur Rundung übergibt.


Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche