Згідно з документацією, decimal.Round
метод використовує алгоритм кругового до рівного, який не є загальним для більшості застосунків. Тому я завжди закінчую писати власну функцію, щоб зробити більш природний алгоритм повороту:
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;
}
Хтось знає причину цього рішення щодо дизайну?
Чи є вбудована реалізація алгоритму круглої половини в рамках? А може, якийсь некерований API Windows?
Це може ввести в оману для початківців, які просто пишуть, decimal.Round(2.5m, 0)
очікуючи 3 в результаті, але отримуючи 2 натомість.