2012-03-29 16 views
7

In C# versuche ich, die letzten beiden Dezimalstellen eines Doppels ohne Keulen zu erhalten. Ich habe alles von Math.Floor bis Math.Truncate versucht und nichts funktioniert.Die letzten 2 Nachkommastellen ohne Rundung erhalten

Proben der Ergebnisse würde Ich mag:

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

Irgendwelche Ideen?

+1

Wenn Sie Arbeit in * Dezimal * dann warum verwenden Sie * double *, wenn Sie * dezimal * verwenden könnten? –

+0

Sie können zu diesem Beitrag gehen und finden, was es für Sie passt http://how-to-code-net.blogspot.ro/2012/09/how-to-format-number-to-x-decimal.html –

Antwort

22

Nun, es ist mathematisch einfach:

var f = 1.1234; 
f = Math.Truncate(f * 100)/100; // f == 1.12 

Verschieben Sie die Dezimal zwei Stellen nach rechts, in einen int warf sie zu kürzen, verschieben sich wieder nach links zwei Stellen. Es mag Wege geben, dies auch zu tun, aber ich kann jetzt nicht nachsehen. Man könnte es verallgemeinern:

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

Nicht so einfach. Doppel halten einen größeren Bereich als Ints. – Joe

+0

@joe: Ahh guter Punkt, verwenden Sie Math.Truncate statt, keine Besetzung erforderlich –

+0

@EdS. Ich habe dies auf den Wert 136.2025 mit Ihrer ersten Methode versucht und es auf 136.2 getrimmt und die 0 fallen lassen. Gibt es eine Möglichkeit, die 0 drin zu halten? – mint

5
double d = Math.Truncate(d * 100)/100; 
2

Eine allgemeine Lösung:

public static double SignificantTruncate(double num, int significantDigits) 
    { 
     double y = Math.Pow(10, significantDigits); 
     return Math.Truncate(num * y)/y; 
    } 

Dann

double x = 5.3456; 
    x = SignificantTruncate(x,2); 

Wird das gewünschte Ergebnis x=5.34 erzeugen.

14

Mein Tipp: Stop mit double an erster Stelle. Wenn Sie Dezimalrundung benötigen, dann sind die Chancen gut, dass Sie decimal verwenden sollten. Was ist deine Bewerbung?

Wenn Sie ein Doppel tun haben, können Sie es wie folgt tun:

double r = whatever; 
decimal d = (decimal)r; 
decimal truncated = decimal.Truncate(d * 100m)/100m; 

Beachten Sie, dass diese Technik nicht, wenn der absolute Wert des Doppels größer als 792281625142643375935439504 ist, weil die Multiplikation mit 100 fehl . Wenn Sie mit so großen Werten umgehen müssen, müssen Sie spezielle Techniken anwenden. (Natürlich durch die Zeit, ein doppelt so groß ist, sind Sie weit über seine Fähigkeit, ohnehin Werte mit zwei Stellen nach dem Komma darzustellen.)

2
Math.Round(NumberToRound - (double)0.005,2) 

dh

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 
Verwandte Themen