9
votes

Obtenez 2 derniers endroits décimaux sans arrondissement

en C #, j'essaie d'obtenir les deux derniers endroits décimaux d'un double sans arrondissement. J'ai tout essayé de math.floor code> à math.trunate code> et rien ne fonctionne.

échantillons des résultats que je voudrais: p>

1,424.2488298 -> 1,424.24
53.5821 -> 53.58
10,209.2991 -> 10,209.29


2 commentaires

Si vous travaillez dans décimal alors pourquoi utilisez-vous double lorsque vous pouviez utiliser décimal ?


Vous pouvez aller à ce message et trouver ce qu'il convient à vous Comment-code-net.blogspot.ro/2012/09/...


5 Réponses :


24
votes

Bien, mathématiquement, c'est simple:

double Truncate(double value, int places)
{
    // not sure if you care to handle negative numbers...       
    var f = Math.Pow( 10, places );
    return Math.Truncate( value * f ) / f;
}


5 commentaires

Pas si simple. Les doubles contiennent une plus grande gamme que l'INTS.


@joe: Ahh bon point, utilisez Math.trunate à la place, aucun casting requis


@Eds. J'ai essayé ceci sur la valeur 136.2025 à l'aide de votre première méthode et il la coupe à 136,2 et laissé tomber le 0. Y a-t-il un moyen de garder le 0 dedans?


@Mint: Eh bien, maintenant, vous parlez d'affichage, pas le nombre lui-même. Il n'y a pas de différence entre 136.2 , 136.20 et 136.2000000 . Si vous souhaitez imprimer avec un certain nombre d'endroits affichés, examinez la mise en forme de chaîne dans des appels vers string.format .


@Mint: Veillez également à noter ce que l'Eric Lippert a dit dans son poste. Vous feriez peut-être mieux d'utiliser le type décimal et la multiplication échouera si cela entraînerait un nombre supérieur à la valeur max pour un double .



6
votes
 double d = Math.Truncate(d * 100) / 100;

0 commentaires

2
votes

Une solution générale: xxx

puis xxx

produise le résultat souhaité x = 5.34 .


0 commentaires

14
votes

Mon conseil: Arrêtez d'utiliser Double en premier lieu . Si vous avez besoin d'arrondi décimal, les chances sont bonnes, vous devez utiliser décimal . Quelle est votre application?

Si vous avez un double, vous pouvez le faire comme ceci: xxx

Notez que cette technique échouera si la valeur absolue du double est plus gros que 792281625142643375935439504, car la multiplication par 100 échouera. Si vous avez besoin de gérer des valeurs qui grandes, vous devrez utiliser des techniques spéciales. (Bien sûr, au moment où un double est-ce grand, vous au-delà de sa capacité à représenter des valeurs à deux chiffres après la décimale de toute façon.)


0 commentaires

2
votes
Math.Round(53.5821 - (double)0.005,2) // 53.58
Math.Round(53.5899 - (double)0.005,2) // 53.58
Math.Round(53.5800 - (double)0.005,2) // 53.58

0 commentaires