2008-12-01 44 views
31

Duplicar posible:
c# - How do I round a decimal value to 2 decimal places (for output on a page)número Truncar decimal no redondear

quiero truncar los decimales, como a continuación

es decir

  • 2,22939393 -> 2.229
  • 2,22977777 -> 2,229
+0

Pregunta relacionada: http://stackoverflow.com/questions/304011/truncate-a-decimal-value-in-c – strager

+1

Creo que el culo embly instruction .trn hará esto por usted también. –

+4

La pregunta duplicada no dice nada acerca de redondear sin truncar. Aunque similar, los aspectos clave de esta pregunta (no redondear) no son respondidos correctamente por el "duplicado". Votando para reabrir – psubsee2003

Respuesta

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

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

+2

wow todo eso solo para acortar un número. –

+0

Parece mucho, pero está haciendo mucho menos trabajo que convertirlo en una cadena. :) –

+0

es una forma más correcta también. –

55

Puede utilizar Math.Round:

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

O puede utilizar ToString con la N3 numeric format.

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

EDIT: Puesto que usted no desea redondeo, puede utilizar simplemente Math.Truncate:

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

No funciona con el segundo ejemplo. Solo quiero que se trunque - no se redondea. –

+4

+1 para Math.Truncate – Peter

+1

Solo para reiterar: +1 para Math.Truncate, -1 para Math.Round, que no resuelve la pregunta. –

0

¿Qué formato quieres obtener?

Si usted es feliz con una cadena a continuación, consideremos 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

Yo espero que ayude .... pero a menos que se identifica que el lenguaje que está utilizando y el formato en el que desea que la salida es difícil sugerir una solución adecuada.

+1

Esto no ayuda al OP porque redondea los dígitos, en lugar de truncar. Además, el especificador de precisión para el formato '" G "' es para el número total de dígitos, no solo los decimales (que es lo que '' F "' hace) – sinelaw

-2

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 

Se puede writen más corto, pero esto es más descriptivo.

EDIT: forma corta:

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

Puede ser porque no compila. ¿En qué idioma estabas desarrollando? Intenté esto en C# justo ahora y me da un error al tratar de multiplicar un decimal por un doble. –

0

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 
-3

olvido de todo sólo echa un vistazo a este

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

Esto está mal. La publicación original está buscando truncar. Esto será redondo. 2.2296 dará como resultado 2.23. –

8

Una función para truncar una 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; 
} 
+1

Esto falla en números grandes con 'System.OverflowException: el valor era demasiado grande o demasiado pequeño para un Int32' – sinelaw

7

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

Prueba este

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

Esto es similar a TCKs sugerencia anterior, pero utilizando en lugar de las conversiones Math.Truncate int

VB: pero usted consigue 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 
Cuestiones relacionadas