Zgodnie z dokumentacją decimal.Round
metoda wykorzystuje algorytm zaokrąglania do parzystości, który nie jest powszechny w większości aplikacji. Dlatego zawsze kończę na napisaniu niestandardowej funkcji, aby wykonać bardziej naturalny algorytm zaokrąglania do połowy:
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;
}
Czy ktoś zna przyczynę tej decyzji dotyczącej projektu ramowego?
Czy jest jakaś wbudowana implementacja algorytmu zaokrąglania do połowy w strukturze? A może jakiś niezarządzany interfejs Windows API?
Może to być mylące dla początkujących, którzy po prostu piszą, decimal.Round(2.5m, 0)
oczekując 3, ale zamiast tego otrzymują 2.