Según la documentación, el decimal.Round
método utiliza un algoritmo de redondeo a par que no es común para la mayoría de las aplicaciones. Así que siempre termino escribiendo una función personalizada para hacer el algoritmo más natural de redondeo a la mitad:
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;
}
¿Alguien sabe la razón detrás de esta decisión de diseño del marco?
¿Existe alguna implementación incorporada del algoritmo de redondeo a la mitad en el marco? ¿O tal vez alguna API de Windows no administrada?
Podría ser engañoso para los principiantes que simplemente escriben decimal.Round(2.5m, 0)
esperando 3 como resultado, pero obteniendo 2 en su lugar.