Número decimal truncado no redondeado

Posible duplicado:
c # – ¿Cómo redondeo un valor decimal a 2 decimales (para salida en una página)

Quiero truncar los decimales como a continuación

es decir

  • 2.22939393 -> 2.229
  • 2.22977777 -> 2.229

    double d = 2.22977777; d = ( (double) ( (int) (d * 1000.0) ) ) / 1000.0 ; 

    Por supuesto, esto no funcionará si estás tratando de truncar el error de redondeo, pero debería funcionar bien con los valores que das en tus ejemplos. Consulte las primeras dos respuestas a esta pregunta para obtener detalles sobre por qué a veces no funcionará.

    Puedes usar Math.Round :

     decimal rounded = Math.Round(2.22939393, 3); //Returns 2.229 

    O puede usar ToString con el formato numérico N3.

     string roundedNumber = number.ToString("N3"); 

    EDITAR: Como no desea redondear, puede usar Math.Truncate fácilmente:

     Math.Truncate(2.22977777 * 1000) / 1000; //Returns 2.229 

    Una función para truncar un número arbitrario de decimales:

     public decimal Truncate(decimal number, int digits) { decimal stepper = (decimal)(Math.Pow(10.0, (double)digits)); int temp = (int)(stepper * number); return (decimal)temp / stepper; } 

    Aquí hay un método de extensión que no sufre desbordamiento de enteros (como lo hacen algunas de las respuestas anteriores). También almacena algunos poderes de 10 para mayor eficiencia.

     static double[] pow10 = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10 }; public static double Truncate(this double x, int precision) { if (precision < 0) throw new ArgumentException(); if (precision == 0) return Math.Truncate(x); double m = precision >= pow10.Length ? Math.Pow(10, precision) : pow10[precision]; return Math.Truncate(x * m) / m; } 

    Esto es similar a la sugerencia de TcK anterior, pero utilizando conversiones math.truncate en lugar de int

    VB: pero entenderás la idea

     Private Function TruncateToDecimalPlace(byval ToTruncate as decimal, byval DecimalPlaces as integer) as double dim power as decimal = Math.Pow(10, decimalplaces) return math.truncate(totruncate * power) / power end function 

    ¿Qué formato quieres la salida?

    Si está contento con una cadena, considere el siguiente código C #:

     double num = 3.12345; num.ToString("G3"); 

    El resultado será “3.12”.

    Este enlace puede ser útil si usa .NET. http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

    Espero que eso ayude … pero a menos que identifiques el idioma que estás utilizando y el formato en el que deseas el resultado, es difícil sugerir una solución adecuada.

    Quizás otra solución rápida podría ser:

     >>> float("%.1f" % 1.00001) 1.0 >>> float("%.3f" % 1.23001) 1.23 >>> float("%.5f" % 1.23001) 1.23001 

    Prueba esto

     double d = 2.22912312515; int demention = 3; double truncate = Math.Truncate(d) + Math.Truncate((d - Math.Truncate(d)) * Math.Pow(10.0, demention)) / Math.Pow(10.0, demention); 

    Prueba esto:

     decimal original = GetSomeDecimal(); // 22222.22939393 int number1 = (int)original; // contains only integer value of origina number decimal temporary = original - number1; // contains only decimal value of original number int decimalPlaces = GetDecimalPlaces(); // 3 temporary *= (Math.Pow(10, decimalPlaces)); // moves some decimal places to integer temporary = (int)temporary; // removes all decimal places temporary /= (Math.Pow(10, decimalPlaces)); // moves integer back to decimal places decimal result = original + temporary; // add integer and decimal places together 

    Puede ser escrito más corto, pero esto es más descriptivo.

    EDITAR: manera corta:

     decimal original = GetSomeDecimal(); // 22222.22939393 int decimalPlaces = GetDecimalPlaces(); // 3 decimal result = ((int)original) + (((int)(original * Math.Pow(10, decimalPlaces)) / (Math.Pow(10, decimalPlaces)); 

    Olvida todo, solo mira esto

     double num = 2.22939393; num = Convert.ToDouble(num.ToString("#0.000"));