2009-03-11 11 views

Odpowiedz

68

Zastosowanie Math.round(), ewentualnie w połączeniu z MidpointRounding.AwayFromZero

np

Math.Round(1.2) ==> 1 
Math.Round(1.5) ==> 2 
Math.Round(2.5) ==> 2 
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3 
+5

Czy "Convert.ToInt32()" nie zrobi tego samego, czy też po prostu usuwa wszystko po przecinku? –

+144

W rzeczywistości nie tworzy liczby całkowitej, ale podwójnej. – gatopeich

+0

Myślę, że istnieje sprzeczność (tj. Błąd) między wierszami 2 i 3 powyżej, nie? – Ronnie

188
double d = 1.234; 
int i = Convert.ToInt32(d); 

Reference

Uchwyty zaokrąglenie tak:

zaokrąglone do najbliższej 32-bitowej liczby całkowitej ze znakiem. Jeśli wartość jest w połowie długości między dwiema liczbami całkowitymi, zwracana jest liczba parzysta; czyli 4,5 jest konwertowany do 4, a 5,5 jest konwertowany do 6.

+5

Znacznie lepiej, że 'Math.Round' jak zwraca int w razie potrzeby. – Keith

+5

@Keith: Ale nieważnie zaokrągla ** even.5 ** to * even * zamiast na * even + 1 * ... –

+7

@ robert-koritnik. Nie wiem, dlaczego jest to "nieprawidłowe". OP nie określił preferowanej reguły zaokrąglania, a "round .5 to nearest even" jest standardową regułą. Zawsze zaokrąglanie ma niepożądane efekty statystyczne. – Keith

8
double d; 
int rounded = (int)Math.Round(d); 
0

Zajmuję się kalkulator naukowy, że sport przycisk Int. Znalazłem następujące jest proste, niezawodne rozwiązanie:

double dblInteger; 
if(dblNumber < 0) 
    dblInteger = Math.Ceiling(dblNumber); 
else 
    dblInteger = Math.Floor(dblNumber); 

Math.Round czasami wywołuje nieoczekiwane lub niepożądane skutki, a jawne konwersji do liczby całkowitej (przez gipsie lub Convert.ToInt ...) często powoduje błędne wartości dla liczb o wyższej precyzji. Powyższa metoda wydaje się zawsze działać.

+1

nie zaokrągla w górę wszystkie wartości ujemne i zaokrągla wszystkie liczby dodatnie? To niekoniecznie jest liczbą całkowitą "neaerest". –

+0

to nie jest najbliższa liczba. –

+0

Biorąc pod uwagę 1,99, to zwraca 1,0. –

31

Można również użyć funkcji:

//Works with negative numbers now 
static int MyRound(double d) { 
    if (d < 0) { 
    return (int)(d - 0.5); 
    } 
    return (int)(d + 0.5); 
} 

zależności od architektury to kilka razy szybciej.

+0

To było dla mnie idealne, ponieważ Math.Round nie działał tak, jak chciałem. – Johannes

+0

@ cullub tak to robi. Konwertuje podwójne d, do którego dołączono 0,5, na liczbę całkowitą. – Darrell

+0

To jest moja preferowana metoda - działa w bardzo prosty sposób. O wiele krótszy i łatwiejszy do odczytania niż Math.Round (d, MidpointRounding.AwayFromZero) i bardziej zwięzły niż użycie instrukcji if, aby wybrać zaokrąglenie w dół lub zaokrąglenie w górę. AND, faktycznie zwraca liczbę całkowitą na końcu, a nie podwójne – binderbound

4

Wiem, że to pytanie jest stare, ale natknąłem się na niego w poszukiwaniu odpowiedzi na moje podobne pytanie. Pomyślałem, że podzielę się bardzo pożyteczną wskazówką, którą otrzymałem.

Podczas konwersji do int, po prostu dodaj .5 do swojej wartości przed downcastingiem. Ponieważ downcasting na int zawsze spada do niższej liczby (np. (Int) 1,7 = 1), jeśli twoja liczba wynosi .5 lub więcej, dodanie .5 spowoduje przejście do następnego numeru, a twój downcast do int powinien zwrócić poprawną wartość . (np. (int) (1,8 + 0,5) = 2)

Mam nadzieję, że ta odpowiedź jest przydatna każdemu.

+12

Problem polega na próbie przekonwertowania wartości ujemnych w ten sposób. Na przykład -1.25 kończy się na 0. (-1.25 + 0.5 = 0.75, a po odrzuceniu do int jest 0). Musisz więc odjąć 0,5 od wartości ujemnych. – Eternal21

Powiązane problemy