¿Cómo se redondea un número a dos decimales en C#?
Quiero hacer esto usando la Math.Round
función.
A continuación se muestran algunos ejemplos:
decimal a = 1.994444M;
Math.Round(a, 2); //returns 1.99
decimal b = 1.995555M;
Math.Round(b, 2); //returns 2.00
También es posible que desees ver cómo los banqueros redondean/redondean a pares con la siguiente sobrecarga:
Math.Round(a, 2, MidpointRounding.ToEven);
Hay más información al respecto aquí .
Prueba esto:
twoDec = Math.Round(val, 2)
Si quieres una cuerda
> (1.7289).ToString("#.##")
"1.73"
o un decimal
> Math.Round((Decimal)x, 2)
1.73m
¡Pero recuerda! El redondeo no es distributivo, es decir. round(x*y) != round(x) * round(y)
. Así que no redondees hasta el final del cálculo, de lo contrario perderás precisión.
Personalmente nunca redondeo nada. Manténgalo lo más decidido posible, ya que el redondeo es una pista falsa en CS de todos modos. Pero sí desea formatear los datos para sus usuarios y, para ese fin, creo que string.Format("{0:0.00}", number)
es un buen enfoque.
Si desea redondear un número, puede obtener diferentes resultados dependiendo de: cómo utiliza la función Math.Round() (si es para redondear hacia arriba o hacia abajo), está trabajando con números dobles y/o flotantes y aplicas el redondeo del punto medio. Especialmente, cuando se usa con operaciones dentro de él o la variable a redondear proviene de una operación. Digamos que quieres multiplicar estos dos números: 0,75 * 0,95 = 0,7125 . ¿Bien? No en C#
Veamos qué pasa si quieres redondear al tercer decimal:
double result = 0.75d * 0.95d; // result = 0.71249999999999991
double result = 0.75f * 0.95f; // result = 0.71249997615814209
result = Math.Round(result, 3, MidpointRounding.ToEven); // result = 0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = 0.712. Should be 0.713
Como puede ver, la primera Ronda() es correcta si desea redondear hacia abajo el punto medio. Pero la segunda Ronda() está mal si quieres redondear.
Esto se aplica a los números negativos:
double result = -0.75 * 0.95; //result = -0.71249999999999991
result = Math.Round(result, 3, MidpointRounding.ToEven); // result = -0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = -0.712. Should be -0.713
Entonces, en mi humilde opinión, deberías crear tu propia función de ajuste para Math.Round() que se ajuste a tus necesidades. Creé una función en la que el parámetro 'roundUp=true' significa redondear al siguiente número mayor. Es decir: 0,7125 se redondea a 0,713 y -0,7125 se redondea a -0,712 (porque -0,712 > -0,713). Esta es la función que creé y funciona para cualquier número de decimales:
double Redondea(double value, int precision, bool roundUp = true)
{
if ((decimal)value == 0.0m)
return 0.0;
double corrector = 1 / Math.Pow(10, precision + 2);
if ((decimal)value < 0.0m)
{
if (roundUp)
return Math.Round(value, precision, MidpointRounding.ToEven);
else
return Math.Round(value - corrector, precision, MidpointRounding.AwayFromZero);
}
else
{
if (roundUp)
return Math.Round(value + corrector, precision, MidpointRounding.AwayFromZero);
else
return Math.Round(value, precision, MidpointRounding.ToEven);
}
}
La variable 'corrector' sirve para corregir la inexactitud de operar con números flotantes o dobles.