truncar truncamiento redondeo redondear que numeros negativos matematicas enteros ejercicios ejemplos decimales .net floating-point truncate

.net - truncamiento - Número decimal truncado no redondeado



truncar numeros enteros (10)

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

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


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


Olvida todo, solo mira esto

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


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));


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


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


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; }


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