De acordo com a documentação, o decimal.Round
método usa um algoritmo de arredondamento para o mesmo que não é comum na maioria dos aplicativos. Por isso, sempre acabo escrevendo uma função personalizada para executar o algoritmo round-half-up mais natural:
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;
}
Alguém sabe o motivo por trás dessa decisão de design da estrutura?
Existe alguma implementação interna do algoritmo round-half-up na estrutura? Ou talvez alguma API do Windows não gerenciada?
Pode ser enganoso para iniciantes que simplesmente escrevem decimal.Round(2.5m, 0)
esperando 3 como resultado, mas obtendo 2.