¿Cómo se redondea un número a dos decimales en C#?

Resuelto asked hace 15 años • 0 respuestas

Quiero hacer esto usando la Math.Roundfunción.

 avatar Nov 02 '08 23:11
Aceptado

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í .

Eoin Campbell avatar Nov 02 '2008 16:11 Eoin Campbell

Prueba esto:

twoDec = Math.Round(val, 2)
John Boker avatar Nov 02 '2008 16:11 John Boker

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.

Colonel Panic avatar Mar 27 '2013 01:03 Colonel Panic

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.

Gleno avatar Feb 23 '2012 02:02 Gleno

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.

fedesanp avatar May 09 '2019 19:05 fedesanp