38 votes

Le nombre décimal tronqué n'est pas arrondi

Duplicata possible:
c # - Comment arrondir une valeur décimale à 2 décimales (pour la sortie sur une page)

Je veux tronquer les décimales comme ci-dessous

c'est à dire

  • 2.22939393 -> 2.229
  • 2.22977777 -> 2.229

63voto

CMS Points 315406

Vous pouvez utiliser Math.Round :

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

Ou vous pouvez utiliser ToString avec le format numérique N3.

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

EDIT: Puisque vous ne voulez pas d'arrondi, vous pouvez facilement utiliser Math.Truncate :

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

17voto

Bill the Lizard Points 147311
 double d = 2.22977777;
d = ( (double) ( (int) (d * 1000.0) ) ) / 1000.0 ;
 

Bien sûr, cela ne fonctionnera pas si vous essayez de tronquer l'erreur d'arrondi, mais cela devrait fonctionner correctement avec les valeurs que vous donnez dans vos exemples. Consultez les deux premières réponses à cette question pour savoir pourquoi cela ne fonctionne pas parfois.

8voto

Glenn Slayden Points 1995

Voici une méthode d'extension qui ne souffre pas d'un débordement d'entier (comme le font certaines des réponses ci-dessus). Il met également en cache certains pouvoirs de 10 pour plus d'efficacité.

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

7voto

Carl Hörberg Points 2786

Une fonction pour tronquer un nombre arbitraire de décimales:

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

3voto

Jim Points 11

Ceci est similaire à la suggestion TcK ci-dessus, mais en utilisant math.truncate plutôt que des conversions int

VB: mais vous aurez l'idée

 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X