Secondo la documentazione, il decimal.Round
metodo utilizza un algoritmo round-to-even che non è comune per la maggior parte delle applicazioni. Quindi finisco sempre per scrivere una funzione personalizzata per eseguire l'algoritmo round-half-up più naturale:
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;
}
Qualcuno sa il motivo dietro questa decisione di progettazione del framework?
Esiste una implementazione integrata dell'algoritmo round-half-up nel framework? O forse qualche API Windows non gestita?
Potrebbe essere fuorviante per i principianti che scrivono semplicemente decimal.Round(2.5m, 0)
aspettandosi di conseguenza 3 ma ottenendo invece 2.