In .NET 1.1 ist, wie in einigen anderen Sprachen auch, das Runden mit Math.Round auf Grund von möglichen Verzerrungen bei Statistiken (siehe Wikipedia, siehe IEEE 754), nicht für ein kaufmännisches Runden geeignet. Aus 3,65 wird (bei Runden auf eine Ziffer) 3,6 da zur nächsten geraden Stelle gerundet wird. Diese statische Methode umgeht diese Besonderheit und ermöglicht ein kaufmännisches Runden.
/// <summary>
/// Rundet kaufmännisch auf die Anzahl der übergebenen Nachkommastellen
///
/// Achtung: Seit .NET 2.0 gibt es folgende Überladung die dieses Snippet hinfällig machen: Math.Round(3.65m,1,MidpointRounding.AwayFromZero)
/// </summary>
/// <param name="value">Zu rundender Wert</param>
/// <param name="dec">Anzahl der Nachkommastellen</param>
/// <returns>Gerundeter Wert</returns>
public static decimal CommercialRound(decimal value, int dec)
{
// um die Anzahl der Dezimalstellen nach links verschieben
decimal x = value * Convert.ToDecimal(Math.Pow(10, dec));
// Dezimalstellen abtrennen
decimal y = Math.Floor(x);
// ist die Differenz größer oder gleich 0.5 soll aufgerundet werden
if ((x-y) >= 0.5m) y++;
// um die Anzahl der Dezimalstellen nach rechts verschieben
return y / Convert.ToDecimal(Math.Pow(10, dec));
}
4 Kommentare zum Snippet