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
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).
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"));
double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));
Multipliez par 1000 puis utilisez Tronquer puis divisez par 1000.
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
.
Vous pouvez utiliser:
double example = 12.34567;
double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;
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;
}
En C lang:
double truncKeepDecimalPlaces(double value, int numDecimals)
{
int x = pow(10, numDecimals);
return (double)trunc(value * x) / x;
}