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