2010-09-26 11 views
9

Cela devrait être facile, mais je ne peux pas trouver un construit dans la méthode pour cela, le framework .net doit avoir une méthode pour le faire!Comment arrondir une décimale à 2 décimales dans .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

Voulez-vous arrondir la décimale elle-même ou une représentation de texte? –

+0

@Henk, j'ai besoin de sortir la valeur sous forme de texte, mais je préfère faire l'arrondi avant la sortie. C'est probablement la valeur devra nourrir dans d'autres calcs plus tard. –

+0

duplication possible de [Arrondir un double à 2 chiffres significatifs après le point décimal] (http: // stackoverflow.com/questions/2808535/round-a-double-to-2-significatif-figures-after-decimal-point) – ecatmur

Répondre

0

Il n'existe aucune méthode de construction dans l'infrastructure .net pour ce faire, d'autres réponses indiquent comment écrire votre propre code.

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

beurre alors ma solution, comme Math.Floor donne le résultat correct avec des nombres négatifs. voir http://stackoverflow.com/questions/14/whats-the-difference-between-math-floor-and-math-truncate-in-net –

3

Utilisez .Truncate() pour obtenir quantité exacte, ou .Round() à arrondir.

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 

Ou vous pouvez faire une méthode d'extension pour l'exécuter comme 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 vous arrondissez vers le bas alors vous avez besoin:

Math.Floor(number * 100)/100; 

si vous cherchez quelque chose appelé «arrondis banquiers» (probablement pas si c'est pour la production et non pour les statistiques/sommation) alors:

Math.Round(number, 2); 

Enfin, si vous voulez, pas sûr de ce que le terme correct est « arrondi normal »:

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

Regardez ma réponse ci-dessous: MidpointRounding.AwayFromZero ou MidpointRounding.ToEven spécifiez comment pour traiter les numéros se terminant par '5': le MidpointRounding.ToEven spécifier que 1.135 devrait être rond à 1.13, et 1.145 à 1.15 le MidpointRounding.AwayFromZero spécifier que 1.135 devrait être rond à 1.14, et 1.145 à 1.15 –

5

Utilisez Math.Floor si vous voulez arrondir tha valeur ou Math.Round si vous voulez obtenir un tour exact. Math.Truncate supprimer simplement la partie décimale du nombre, de sorte que vous obtenez de mauvais résultats pour les nombres négatifs:

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

Math.Floor retourne toujours la plus petite valeur intégrale qui est moindre (au sol) ou supérieur (plafond) que la valeur spécifiée. Donc, vous n'obtenez pas un arrondi correct. Exemple:

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 

Toujours préférer la version de Math.Round contenant le paramètre d'arrondi à mi-point. Ce paramètre spécifie comment gérer les valeurs médianes (5) en tant que dernier chiffre.

Si vous ne spécifiez pas AwayFromZero comme valeur pour param, vous obtiendrez le comportement par défaut, ToEven. Par exemple, en utilisant Toeven comme méthode d'arrondi, vous obtenez:

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

à la place, à l'aide MidPoint.AwayFromZero param:

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

Ainsi, pour un arrondissement normal, il est préférable d'utiliser ce code:

var value=2.346; 
var result = Math.Round(value, 2, MidpointRounding.AwayFromZero); 
+0

avez-vous lu le quesion J'ai dit "arrondi" –

+0

Désolé, mes excuses ... –