2010-09-26 14 views
9

Esto debería ser fácil, pero no puedo encontrar un integrado en el método, ¡el framework .net debe tener un método para hacerlo!¿Cómo redondeo un decimal a 2 lugares decimales en .Net?

private decimal RoundDownTo2DecimalPlaces(decimal input) 
{ 
    if (input < 0) 
    { 
     throw new Exception("not tested with negitive numbers"); 
    } 

    // There must be a better way! 
    return Math.Truncate(input * 100)/100; 
} 
+0

¿Desea redondear el decimal mismo o una representación de texto? –

+0

@Henk, necesito mostrar el valor como texto, pero prefiero redondear antes de la salida. Es probable que el valor tendrá que alimentar a otros calcs más tarde. –

+0

posible duplicado de [Redondea un doble a 2 cifras significativas después del punto decimal] (http: // stackoverflow.com/questions/2808535/round-a-double-to-2-significant-figures-after-decimal-point) – ecatmur

Respuesta

0

No hay un método de compilación en el .NET Framework para hacer esto, otras respuestas dicen cómo escribir su propio código.

2
Math.Floor(number * 100)/100; 
+0

mantequilla entonces mi solución, como Math.Floor da el resultado correcto con números negitive. ver http://stackoverflow.com/questions/14/whats-the-difference-between-math-floor-and-math-truncate-in-net –

3

Uso .Truncate() para obtener la cantidad exacta, o .Round() para redondear.

decimal dNum = (decimal)165.6598F; 
decimal dTruncated = (decimal)(Math.Truncate((double)dNum*100.0)/100.0); //Will give 165.65 
decimal dRounded = (decimal)(Math.Round((double)dNum, 2)); //Will give 165.66 

O puede presentar un método de extensión para ejecutarlo como dNum.ToTwoDecimalPlaces();

public static class Extensions 
{ 
    public static decimal ToTwoDecimalPlaces(this decimal dNum) 
    { 
     return ((decimal)(Math.Truncate((double)dNum*100.0)/100.0)); 
    } 
} 
15

Si redondear abajo entonces usted necesita:

Math.Floor(number * 100)/100; 

si usted está buscando algo llamado 'redondeo de banqueros' (probablemente no si es para salida y no para estadísticas/suma) entonces:

Math.Round(number, 2); 

Por último, si quieres, no está seguro de cuál es el término correcto es 'redondeo normal':

Math.Round(number, 2, MidpointRounding.AwayFromZero); 
+0

Mira mi respuesta a continuación: MidpointRounding.AwayFromZero o MidpointRounding.ToEven especifica cómo para manejar números que terminan con '5': el MidpointRounding.ToEven especifica que 1.135 debe ser redondo a 1.13, y 1.145 a 1.15 el MidpointRounding.AwayFromZero especifica que 1.135 debe ser redondo a 1.14, y 1.145 a 1.15 –

5

Uso Math.Floor si desea redondear hacia abajo tha valor o Math.Round si desea obtener una ronda exacta. Math.Truncate basta con quitar la parte decimal del número, para que pueda obtener malos resultados para los números negativos:

var result= Math.Floor(number * 100)/100; 

Math.floor siempre devuelve el valor más pequeño integral que es menor (de suelo) o superior (techo) de la valor específico. Entonces no obtienes un redondeo correcto. Ejemplo:

Math.Floor(1.127 * 100)/100 == 1.12 //should be 1.13 for an exact round 
Math.Ceiling(1.121 * 100)/100 == 1.13 //should be 1.12 for an exact round 

Siempre prefiera la versión de Math.Round que contenga el parámetro de redondeo de punto medio. Este parámetro especifica cómo manejar los valores de punto medio (5) como último dígito.

Si no especifica AwayFromZero como el valor para param, obtendrá el comportamiento predeterminado, que es ToEven. Por ejemplo, el uso de Toeven como método de redondeo, se obtiene:

Math.Round(2.025,2)==2.02 
Math.Round(2.035,2)==2.04 

lugar, utilizando MidPoint.AwayFromZero param:

Math.Round(2.025,2,MidpointRounding.AwayFromZero)==2.03 
Math.Round(2.035,2,MidpointRounding.AwayFromZero)==2.04 

Así, para un redondeo normal, lo mejor es utilizar este código:

+0

leyó la pregunta Dije "redondear" –

+0

Lo siento, mis disculpas ... –

Cuestiones relacionadas