2012-03-29 19 views
7

W języku C# próbuję uzyskać dwa ostatnie miejsca po przecinku z podwójnym zaokrągleniem bez żadnego zaokrąglenia. Próbowałem wszystkiego od Math.Floor do Math.Truncate i nic nie działa.Zdobądź ostatnie 2 miejsca dziesiętne bez zaokrąglania

Próbki wyników Chciałbym:

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

pomysłów?

+1

Jeśli jesteś robisz pracę w * dziesiętnej * następnie, dlaczego używasz * podwójnego *, kiedy możesz używać * dziesiętnego *? –

+0

Możesz przejść do tego posta i znaleźć to, co Ci pasuje http://how-to-code-net.blogspot.ro/2012/09/how-to-format-number-to-x-decimal.html –

Odpowiedz

22

Cóż, matematycznie to proste:

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

Przenieś dziesiętny dwa miejsca w prawo, oddanych do int obciąć, przesunąć go z powrotem do lewej dwóch miejscach. Mogą istnieć sposoby, aby to zrobić, ale nie mogę teraz patrzeć. Można to uogólnić:

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

Nie takie proste. Doubles posiadają większy zasięg niż ints. – Joe

+0

@joe: Ahh dobry punkt, użyj Math.Truncate zamiast, nie wymaga obsady –

+0

@EdS. Próbowałem tego na wartości 136.2025 przy użyciu twojej pierwszej metody i przyciąłem ją do 136,2 i zrzuciłem 0. Czy istnieje sposób na utrzymanie 0 w tym? – mint

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

ogólne rozwiązanie:

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

Następnie

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

przyniesie pożądanego rezultatu x=5.34.

14

Moja rada: przestań używać double na pierwszym miejscu. Jeśli potrzebujesz zaokrąglenia dziesiętnego, wtedy szanse są dobre, powinieneś używać decimal. Jaka jest twoja aplikacja?

Jeśli masz podwójne, można zrobić to tak:

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

Należy zauważyć, że technika ta nie powiedzie się, jeśli wartość bezwzględna podwójnego jest większa niż 792281625142643375935439504, ponieważ mnożenie przez 100 zawiedzie . Jeśli potrzebujesz obsługiwać wartości, które są duże, musisz użyć specjalnych technik. (Oczywiście, do czasu podwójny jest tak duży, jesteś daleko poza jego zdolności do reprezentowania wartości z dwóch cyfr po przecinku miejsce w każdym razie.)

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

tj

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 
Powiązane problemy