Laut der Dokumentation ist die decimal.Round
Methode verwendet einen Round-to-even-Algorithmus, der für die meisten Anwendungen nicht üblich ist. Daher schreibe ich am Ende immer eine benutzerdefinierte Funktion, um den natürlicheren Algorithmus zum Aufrunden zu verwenden:
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 zur Gestaltung des Rahmens?
Gibt es eine integrierte Implementierung des Round-Half-Up-Algorithmus in den Rahmen? Oder vielleicht eine nicht verwaltete Windows-API?
Für Anfänger könnte es irreführend sein, einfach zu schreiben decimal.Round(2.5m, 0)
Sie erwarteten 3, bekamen aber nur 2.