Согласно документации, 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;
}
Кто-нибудь знает причину этого решения дизайна структуры?
Есть ли встроенная реализация алгоритма округления до половины в рамках? Или, может быть, какой-то неуправляемый Windows API?
Это может ввести в заблуждение новичков, которые просто пишут, decimal.Round(2.5m, 0)
ожидая 3 в результате, но получая вместо этого 2.