Okrągły podwójnie w dwóch miejscach dziesiętnych w C #?

258

Chcę zaokrąglić w górę podwójną wartość w dwóch miejscach po przecinku w c # jak mogę to zrobić?

double inputValue = 48.485;

po zaokrągleniu w górę

inputValue = 48.49;

Powiązane: c # - Jak zaokrąglić wartość dziesiętną do 2 miejsc po przecinku (dla danych wyjściowych na stronie)

sanjeev40084
źródło
Należy wziąć pod uwagę, że nie można reprezentować wszystkie wartości zmiennoprzecinkowych użyciem podwójnie, a to może zadziałać cię gdy zaokrąglenia
Liam

Odpowiedzi:

479

To działa:

inputValue = Math.Round(inputValue, 2);
Alex LE
źródło
obejście do trunc float: float myTruncFloat = float.Parse (Math.Round (myFloat, 2) .ToString ());
Piero Alberto
1
Jeśli wartość wynosi 48,0000. Nie przyniesie 48,00. double inputValue = 48,00; inputValue = Math.Round (inputValue, 2); spowoduje tylko 48. Jakiś warkaound?
user1926138
100
Math.Round(inputValue, 2, MidpointRounding.AwayFromZero)
Nandin
źródło
4
Właśnie tego należy użyć. Większość operacji w bankach itp. Odbywa się przy użyciu tej metody (MidpointRounding.AwayFromZero).
MadBoy
41
sugerowanie, że banki używają dubletów, jest przerażające, nie używaj przybliżonych wartości dla waluty.
raggi
6
@raggi Obawiam się, że niektóre (banki) robią ... To by tłumaczyło wiele rzeczy
SparK
4
Tak, wierzę, że właśnie tak powstał film „Przestrzeń biurowa” - zaokrąglając ułamki centów, których nikt nie zauważył. Warto uważać, kiedy arbitralnie użyć zaokrąglania.
atconway
1
I jako część fabuły jednego z oryginalnych filmów Supermana dawno temu.
James Westgate
25

Powinieneś użyć

inputvalue=Math.Round(inputValue, 2, MidpointRounding.AwayFromZero)

Math.Round

Math.Round zaokrągla zmiennoprzecinkową wartość podwójnej precyzji do określonej liczby cyfr ułamkowych.

Punkt środkowy Okrążenie

Określa, w jaki sposób matematyczne metody zaokrąglania powinny przetwarzać liczbę, która znajduje się w połowie odległości między dwiema liczbami.

Zasadniczo powyższa funkcja weźmie wartość wejściową i zaokrągli ją do 2 (lub dowolnej określonej liczby) miejsc dziesiętnych. Z MidpointRounding.AwayFromZerokiedy numer jest w połowie drogi między dwoma innymi, jest ona zaokrąglana w kierunku najbliższego numeru, który jest oddalony od zera. Istnieje również inna opcja, której możesz użyć, aby zaokrąglić w kierunku najbliższej liczby parzystej.

Zastaw
źródło
25

Innym łatwym sposobem jest użycie ToString z parametrem. Przykład:

float d = 54.9700F;    
string s = d.ToString("N2");
Console.WriteLine(s);

Wynik:

54.97
Diwas
źródło
19

Użyj Math.Round

value = Math.Round(48.485, 2);
rekurencyjny
źródło
Pobij mnie do tego (chociaż dodam tam również średnik;))
Reed Copsey
1
Uważaj jednak na MidpointRounding: „Jeśli wartość pierwszej cyfry w wartości po prawej stronie cyfr po przecinku wynosi 5, cyfra w pozycji cyfr jest zaokrąglana w górę, jeśli jest nieparzysta, lub pozostawia niezmienioną, jeśli jest parzysta”
Matthias
8

możesz spróbować jednego z poniższych. istnieje wiele sposobów na to.

1. 
 value=Math.Round(123.4567, 2, MidpointRounding.AwayFromZero) //"123.46"
2.
 inputvalue=Math.Round(123.4567, 2)  //"123.46"
3. 
 String.Format("{0:0.00}", 123.4567);      // "123.46"
4. 
string.Format("{0:F2}", 123.456789);     //123.46
string.Format("{0:F3}", 123.456789);     //123.457
string.Format("{0:F4}", 123.456789);     //123.4568
reza.cse08
źródło
Użyłem czwartej opcji. Pisanie F6 działało dla mnie lepiej niż zapisywanie 6 zer ;-)
Maurice Klimek
2

Użyj interpolowanego ciągu, to wygeneruje zaokrąglony ciąg:

var strlen = 6;
$"{48.485:F2}"

Wynik

"48.49"
bigpony
źródło