Selon la documentation, la decimal.Round
méthode utilise un algorithme d'arrondi à égal qui n'est pas courant pour la plupart des applications. Donc je finis toujours par écrire une fonction personnalisée pour faire l'algorithme arrondi plus naturel:
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;
}
Quelqu'un connaît-il la raison de cette décision de conception du cadre?
Existe-t-il une implémentation intégrée de l'algorithme demi-tour dans le cadre? Ou peut-être une API Windows non gérée?
Il pourrait être trompeur pour les débutants qui écrivent simplement en decimal.Round(2.5m, 0)
s'attendant à 3, mais en obtenant 2 à la place.