Potrzebujesz, MidpointRounding.AwayFromZerojeśli chcesz, aby wartość 0,5 została zaokrąglona w górę. Niestety nie jest to domyślne zachowanie Math.Round(). Jeśli używasz MidpointRounding.ToEven(domyślnie), wartość jest zaokrąglana do najbliższej liczby parzystej ( 1.5jest zaokrąglana do 2, ale 2.5jest również zaokrąglana do 2).
jest ich w każdym razie zaokrąglić 137,5 do 140, a nie 138? Mam na myśli zaokrąglenie do najbliższej dziesiątej?
sam
7
Trzeba Math.Round, nie Math.Ceiling. Ceilingzawsze „zaokrągla” w górę, podczas gdy Roundzaokrągla w górę lub w dół w zależności od wartości po przecinku.
Nadal wygląda podejrzanie. Po pierwsze, pytanie dotyczy zaokrąglania w górę, a po drugie, kiedy wypróbowałem to właśnie teraz, domyślna implementacja Math.Round (1.5) zaokrągla do 2. Więc może to nie być to, czego chciał.
wer.
Twój przykład łączy również przecinek dziesiętny z przecinkiem dziesiętnym. Którego zwykle używasz (chyba w Szwecji)? :)
wer.
oops ... o tak, przepraszam. oczywiście w programowaniu przecinka dziesiętnego, ale w tekście formalnym używamy przecinka dziesiętnego. i tak, szwecja ^^, jeśli chodzi o pytanie i część „zaokrąglania w górę”: myślę, że to tylko błąd językowy. w przykładach podanych przez op niektóre liczby dziesiętne zaokrągla się w dół.
davogotland
@ver I nie zaokrąglam w dół z Math.Round, robię to z rzutem. dlatego ta droga jest ręczna i trochę urocza;)
davogotland
5
Możesz użyć Math.Round tak, jak sugerowali inni (zalecane), lub możesz dodać 0,5 i rzutować na int (co spowoduje usunięcie części dziesiętnej).
Szukałem tego, ale moim przykładem było wzięcie liczby, takiej jak 4,2769 i upuszczenie jej w przedziale zaledwie 4,3. Niezupełnie to samo, ale jeśli to pomoże:
Model.Statistics.AverageReview <= it's just a double from the model
Następnie:
@Model.Statistics.AverageReview.ToString("n1") <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2") <=gives me 4.28
Odpowiedzi:
Więcej informacji znajdziesz w oficjalnej dokumentacji . Na przykład:
Zasadniczo podajesz
Math.Round
metodzie trzy parametry.Przykładowy kod:
var roundedA = Math.Round(1.1, 0); // Output: 1 var roundedB = Math.Round(1.5, 0, MidpointRounding.AwayFromZero); // Output: 2 var roundedC = Math.Round(1.9, 0); // Output: 2 var roundedD = Math.Round(2.5, 0); // Output: 2 var roundedE = Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // Output: 3 var roundedF = Math.Round(3.49, 0, MidpointRounding.AwayFromZero); // Output: 3
Live Demo
Potrzebujesz,
MidpointRounding.AwayFromZero
jeśli chcesz, aby wartość 0,5 została zaokrąglona w górę. Niestety nie jest to domyślne zachowanieMath.Round()
. Jeśli używaszMidpointRounding.ToEven
(domyślnie), wartość jest zaokrąglana do najbliższej liczby parzystej (1.5
jest zaokrąglana do2
, ale2.5
jest również zaokrąglana do2
).źródło
away from zero
oznacza również, że-1.5
zaokrągli się do-2
.zawsze zaokrągla w górę (w kierunku sufitu)
zawsze zaokrągla w dół (w kierunku podłogi)
to, czego szukasz, jest po prostu
który zaokrągla zgodnie z tym postem
źródło
Trzeba
Math.Round
, nieMath.Ceiling
.Ceiling
zawsze „zaokrągla” w górę, podczas gdyRound
zaokrągla w górę lub w dół w zależności od wartości po przecinku.źródło
jest ten podręcznik i całkiem ładny sposób:
double d1 = 1.1; double d2 = 1.5; double d3 = 1.9; int i1 = (int)(d1 + 0.5); int i2 = (int)(d2 + 0.5); int i3 = (int)(d3 + 0.5);
po prostu dodaj 0,5 do dowolnej liczby i rzuć ją na int (lub podłogę), a zostanie matematycznie poprawnie zaokrąglona: D
źródło
Możesz użyć Math.Round tak, jak sugerowali inni (zalecane), lub możesz dodać 0,5 i rzutować na int (co spowoduje usunięcie części dziesiętnej).
double value = 1.1; int roundedValue = (int)(value + 0.5); // equals 1 double value2 = 1.5; int roundedValue2 = (int)(value2 + 0.5); // equals 2
źródło
Tylko przypomnienie. Uważaj na podwójne.
Math.Round(0.3 / 0.2 ) result in 1, because in double 0.3 / 0.2 = 1.49999999 Math.Round( 1.5 ) = 2
źródło
Masz funkcję Math.Round, która robi dokładnie to, co chcesz.
Math.Round(1.1) results with 1 Math.Round(1.8) will result with 2.... and so one.
źródło
1.5
co z wartością? Potrzebujesz więcej parametrów.Zaokrągli to w górę do najbliższej 5 lub nie zmieni się, jeśli jest już podzielne przez 5
public static double R(double x) { // markup to nearest 5 return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0); }
źródło
Szukałem tego, ale moim przykładem było wzięcie liczby, takiej jak 4,2769 i upuszczenie jej w przedziale zaledwie 4,3. Niezupełnie to samo, ale jeśli to pomoże:
Model.Statistics.AverageReview <= it's just a double from the model
Następnie:
@Model.Statistics.AverageReview.ToString("n1") <=gives me 4.3 @Model.Statistics.AverageReview.ToString("n2") <=gives me 4.28
itp...
źródło
Zastosowanie
Math.Round
:double roundedValue = Math.Round(value, 0)
źródło
var roundedVal = Math.Round(2.5, 0);
Da wynik:
var roundedVal = 3
źródło
Jeśli pracujesz z liczbami całkowitymi zamiast liczb zmiennoprzecinkowych, oto sposób.
#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))
Tutaj zarówno „numr”, jak i „denr” są liczbami całkowitymi bez znaku.
źródło
Korzystanie z
Math.Round(number)
rund do najbliższej liczby całkowitej.źródło
Napisz własną metodę rundy. Coś jak,
function round(x) rx = Math.ceil(x) if (rx - x <= .000001) return int(rx) else return int(x) end
źródło
decimal RoundTotal = Total - (int)Total; if ((double)RoundTotal <= .50) Total = (int)Total; else Total = (int)Total + 1; lblTotal.Text = Total.ToString();
źródło