2008-12-01 8 views
31

Possible en double:
c# - How do I round a decimal value to 2 decimal places (for output on a page)troncature nombre décimal non Arrondir

Je veux tronquer les décimales comme ci-dessous

-à-dire

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

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

+1

Je crois que le cul embly instruction .trn le fera aussi pour vous. –

+4

La question en double ne dit rien sur l'arrondissement sans tronquer. Bien que similaire, les aspects clés de cette question (ne pas arrondir) ne sont pas correctement répondu par le "doublon". Voter pour rouvrir. – psubsee2003

Répondre

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

Bien sûr, cela ne fonctionnera pas si vous essayez de tronquer erreur d'arrondi, mais cela devrait fonctionner correctement avec les valeurs que vous donnez dans vos exemples. Voir les deux premières réponses à this question pour plus de détails sur les raisons pour lesquelles cela ne fonctionnera pas parfois.

+2

wow tout cela juste pour raccourcir un nombre. –

+0

Cela ressemble beaucoup, mais cela fait beaucoup moins de travail que la conversion en chaîne. :) –

+0

c'est aussi un moyen plus correct. –

55

Vous pouvez utiliser Math.Round:

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

Ou vous pouvez utiliser ToString avec la N3 numeric format.

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

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

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

Ne fonctionne pas avec le second exemple. Je veux juste qu'il soit tronqué - pas arrondi. –

+4

+1 pour Math.Truncate – Peter

+1

Juste pour réitérer: +1 pour Math.Truncate, -1 pour Math.Round, ce qui ne résout pas la question posée. –

0

De quel format voulez-vous la sortie?

Si vous êtes satisfait avec une chaîne, puis le code suivant considèrent C#:

double num = 3.12345; 
num.ToString("G3"); 

Le résultat sera « 3,12 ».

Ce lien peut être utile si vous utilisez .NET. J'espère que cela aide .... mais à moins que vous identifiez que le langage que vous utilisez et le format dans lequel vous voulez la sortie, il est difficile de suggérer une solution appropriée.

+1

Cela n'aide pas l'OP car il arrondit les chiffres plutôt que de les tronquer. En outre, le spécificateur de précision pour le format '" G "' est pour le nombre total de chiffres, pas seulement les nombres décimaux (ce qui est ce que "F" 'fait) – sinelaw

-2

Essayez ceci:

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 

Il peut être writen plus courte, mais cela est plus descriptif.

EDIT: court chemin:

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

Peut-être parce qu'il ne compile pas. Dans quelle langue développiez-vous? J'ai essayé ceci en C# tout à l'heure et j'ai une erreur pour essayer de multiplier une décimale par un double. –

0

Peut-être une autre solution rapide pourrait être:

>>> float("%.1f" % 1.00001) 
1.0 
>>> float("%.3f" % 1.23001) 
1.23 
>>> float("%.5f" % 1.23001) 
1.23001 
-3

Oublier tout simplement vérifier cette

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

C'est faux. Le message d'origine cherche à tronquer. Cela va tourner. 2.2296 se traduira par 2.23. –

8

Une fonction tronquer une nombre arbitraire de nombres décimaux:

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

Cela échoue sur les grands nombres avec 'System.OverflowException: la valeur était trop grande ou trop petite pour un Int32 – sinelaw

7

Voici une méthode d'extension qui ne souffre pas de débordement d'entier (comme le font certaines des réponses ci-dessus). Il met également en cache certaines puissances de 10 pour l'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; 
} 
0

Essayez cette

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

Ceci est similaire à la suggestion TCKS 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 
Questions connexes