web-dev-qa-db-fra.com

Limiter le double à 3 décimales

C'est ce que j'essaie de réaliser:

Si un double a plus de 3 décimales, je veux tronquer toute décimale au-delà de la troisième. (ne pas arrondir.)

Eg.: 12.878999 -> 12.878

Si un double a moins de 3 décimales, laissez inchangé

Eg.:   125   -> 125
       89.24 -> 89.24

Je suis tombé sur cette commande:

double example = 12.34567;
double output = Math.Round(example, 3);

Mais je ne veux pas arrondir. Selon la commande publiée ci-dessus, 12.34567 -> 12.346

Je veux tronquer la valeur pour qu'elle devienne: 12.345

44
xbonez

Les doubles n'ont pas de décimales - ils ne sont pas basés sur des chiffres décimaux pour commencer. Vous pourriez obtenir "le double le plus proche de la valeur actuelle lorsqu'il est tronqué à trois chiffres décimaux", mais ce ne serait toujours pas exactement le même. Vous feriez mieux d'utiliser decimal.

Cela dit, si c'est uniquement la façon dont l'arrondi se produit qui est un problème, vous pouvez utiliser Math.Truncate(value * 1000) / 1000; qui peut faire ce que vous voulez. (Vous ne voulez pas arrondir du tout, par les sons de celui-ci.) Cependant, il est toujours potentiellement "douteux", car le résultat n'aura pas vraiment seulement trois décimales. Si vous avez fait la même chose avec une valeur décimale, cela fonctionnerait fonctionnerait:

decimal m = 12.878999m;
m = Math.Truncate(m * 1000m) / 1000m;
Console.WriteLine(m); // 12.878

EDIT: Comme l'a souligné LBushkin, vous devriez être clair entre la troncature à des fins affichage (qui peut généralement être effectuée dans un spécificateur de format) et la troncature pour d'autres calculs (dans ce cas, ce qui précède devrait fonctionner).

62
Jon Skeet

Je ne vois aucune raison de perdre explicitement la précision en dehors des objectifs d'affichage. Dans ce cas, utilisez simplement la mise en forme des chaînes.

double example = 12.34567;

Console.Out.WriteLine(example.ToString("#.000"));
39
Chris Martin
double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));
18
Merin Nakarmi

Multipliez par 1000 puis utilisez Tronquer puis divisez par 1000.

7
Josh

Si votre but en tronquant les chiffres est pour des raisons d'affichage, alors vous utilisez simplement une mise en forme appropriée lorsque vous convertissez le double en chaîne.

Des méthodes comme String.Format() et Console.WriteLine() (et autres) vous permettent de limiter le nombre de chiffres de précision avec lesquels une valeur est formatée.

Il est déconseillé de tenter de "tronquer" les nombres à virgule flottante - les nombres à virgule flottante n'ont pas de représentation décimale précise dans de nombreux cas. Appliquer une approche comme augmenter le nombre, le tronquer, puis le réduire peut facilement changer la valeur en quelque chose de tout à fait différent de ce que vous attendiez pour la valeur "tronquée".

Si vous avez besoin de représentations décimales précises d'un nombre, vous devez utiliser decimal plutôt que double ou float.

5
LBushkin

Vous pouvez utiliser:

double example = 12.34567;
double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;
3
Pablo Santa Cruz

Bonnes réponses ci-dessus - si vous cherchez quelque chose de réutilisable, voici le code. Notez que vous souhaiterez peut-être vérifier la valeur des décimales, ce qui peut déborder.

public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces)
{
    decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces));

    return Math.Truncate((power * numberToTruncate)) / power;
}
1
Mike M.

En C lang:

double truncKeepDecimalPlaces(double value, int numDecimals)
{
    int x = pow(10, numDecimals);
    return (double)trunc(value * x) / x;
}
1
alsantos123