2012-09-27 52 views
33

Powiel możliwe:
How do you round a number to two decimal places in C#?Zaokrąglanie zmienną dokładnością do dwóch miejsc po przecinku C#

Jestem zainteresowany jak zmienne zaokrąglić do dwóch miejsc po przecinku. W poniższym przykładzie premia jest zwykle liczbą z czterema miejscami dziesiętnymi. Czy istnieje sposób na zapewnienie, aby zmienna płac była zawsze zaokrąglana do dwóch miejsc po przecinku?

 pay = 200 + bonus; 
     Console.WriteLine(pay); 
+0

Wyszukiwarka Google? http://stackoverflow.com/questions/257005/how-do-you-round-a-number-to-two-decimal-places-in-c – eouw0o83hf

+0

Znacznik zadania domowego jest przestarzały –

+0

wow Tag HomeWork ?? Właśnie zobaczyłem to teraz, http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated?cb=1 – Habib

Odpowiedz

72

Użyj Math.Round i podaj liczbę miejsc dziesiętnych.

Math.Round(pay,2); 

Math.Round Method (Double, Int32)

Zaokrągla podwójnej precyzji zmiennoprzecinkową wartości do określonej liczby cyfr dziesiętnych.

Albo Math.Round Method (Decimal, Int32)

Policzone wartość dziesiętną do określonej liczby cyfr ułamkowych.

+0

I upewnij się, że używasz typu 'float',' double' lub 'decimal', w przeciwnym razie to nigdy nie zadziała. – Aidiakapi

+0

Używam podwójnego, ale nadal nie działa dla mnie. –

+3

nazywamy to 'pay = Math.Round (pay, 2);' – Habib

5
decimal pay = 1.994444M; 

Math.Round(pay , 2); 
1
Console.WriteLine(decimal.Round(pay,2)); 
4

Można zaokrąglić wynik i użyć string.Format ustawić dokładność takiego:

decimal pay = 200.5555m; 
pay = Math.Round(pay + bonus, 2); 
string payAsString = string.Format("{0:0.00}", pay); 
+1

Wątpię, czy możesz użyć 'pay' w dwóch różnych zmysłach w pierwszej linii! Kiedy już używasz 'Math.Round', może nie jest konieczne używanie formatowania napisów? Jeśli nie chcesz zaokrąglić faktycznej struktury liczbowej, ale chcesz tylko skrócić produkowany ciąg, formatowanie łańcuchów jest miłe. W takim przypadku należy również rozważyć ciągi formatujące '" F "' lub '" F2 "' (i "N" ',' "N2" ', np.' String.Format ("{0: N}", zapłacić) 'lub równoważnie' pay.ToString ("N") '. –

+0

@JeppeStigNielsen Masz całkowitą rację co do pierwszej linii! Zmieniono. Interesujące, nigdy wcześniej nie używałam '{0: N}', przypuszczam, że jest istotą pokroju; o) –

+0

Aby wyjaśnić dalej, '" F "' zaokrągla do liczby miejsc po przecinku określonej przez 'NumberFormat' obecnej kultury bieżącego wątku. Często były to dwa miejsca dziesiętne. '" F2 "' zawsze zaokrągla do dwóch miejsc po przecinku. '" N "' i '" N2 "' są podobne, ale wstawiają również separatory grup zgodnie z kulturą. Na przykład '(11223344.5566m) .ToString (" N ")' może wytworzyć sformatowany numer '" 11 223 344,56 "w niektórych kulturach. Zobacz [Standardowe ciągi formatów liczbowych] (http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx). –

2

upewnij się, podać numer, zazwyczaj jest używany podwójne. Math.Round może przyjmować 1-3 argumenty, pierwszy argument to zmienna, którą chcesz zaokrąglić, druga to liczba miejsc dziesiętnych, a trzecia to rodzaj zaokrąglenia.

double pay = 200 + bonus; 
double pay = Math.Round(pay); 
// Rounds to nearest even number, rounding 0.5 will round "down" to zero because zero is even 
double pay = Math.Round(pay, 2, MidpointRounding.ToEven); 
// Rounds up to nearest number 
double pay = Math.Round(pay, 2, MidpointRounding.AwayFromZero); 
17

Powinieneś użyć formularza Math.Round. Pamiętaj, że Math.Round domyślnie stosuje się do zaokrąglania bankiera (zaokrąglanie do najbliższej liczby parzystej), chyba że podasz wartość MidpointRounding. Jeśli nie chcesz korzystać z zaokrąglania bankiera, należy użyć Math.Round(decimal d, int decimals, MidpointRounding mode), tak:

Math.Round(pay, 2, MidpointRounding.AwayFromZero); // .005 rounds up to 0.01 
Math.Round(pay, 2, MidpointRounding.ToEven);  // .005 rounds to nearest even (0.00) 
Math.Round(pay, 2); // Defaults to MidpointRounding.ToEven 

(Why does .NET use banker's rounding?)

2

zwrócić uwagę na fakt, że Roundrund.

Więc (nie wiem czy to ma znaczenie w danej branży, czy też nie), ale:

float a = 12.345f; 
Math.Round(a,2); 

//result:12,35, and NOT 12.34 ! 

Aby uczynić go bardziej precyzyjna sprawy możemy zrobić coś takiego:

int aInt = (int)(a*100); 
float aFloat= aInt /100.0f; 
//result:12,34 
+0

Math.Round nie przyjmuje liczby zmiennoprzecinkowej jako parametru. –

Powiązane problemy