Der Dokumentation zufolge verwendet die decimal.Round
Methode einen Round-to-Even-Algorithmus, der für die meisten Anwendungen nicht üblich ist. Daher schreibe ich immer eine benutzerdefinierte Funktion, um den natürlicheren Round-Half-Up-Algorithmus auszuführen:
public static decimal RoundHalfUp(this decimal d, int decimals)
{
if (decimals < 0)
{
throw new ArgumentException("The decimals must be non-negative",
"decimals");
}
decimal multiplier = (decimal)Math.Pow(10, decimals);
decimal number = d * multiplier;
if (decimal.Truncate(number) < number)
{
number += 0.5m;
}
return decimal.Round(number) / multiplier;
}
Kennt jemand den Grund für diese Entscheidung zum Framework-Design?
Gibt es eine integrierte Implementierung des Round-Half-Up-Algorithmus in das Framework? Oder vielleicht eine nicht verwaltete Windows-API?
Es könnte für Anfänger irreführend sein, einfach zu schreiben decimal.Round(2.5m, 0)
, 3 als Ergebnis zu erwarten, aber stattdessen 2 zu bekommen.