Jak zamienić double na najbliższe int?
147
Użyj Math.round()
, ewentualnie w połączeniu zMidpointRounding.AwayFromZero
na przykład:
Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3
Convert.ToInt32()
zrobi tego samego, czy po prostu usunie wszystko po przecinku?Odniesienie
Uchwyty zaokrągleń w ten sposób:
źródło
Math.Round
ponieważ zwraca int zgodnie z wymaganiami.[0,.5)
- w dół i dokładnie połowę liczb -[.5,1)
- w górę. Zaokrąglanie do nawet nieznacznie odchyla liczby parzyste, ponieważ zaokrągla(.5,1.5)
do 1, ale[1.5,2.5]
do 2.Możesz również użyć funkcji:
W zależności od architektury jest kilkukrotnie szybszy.
źródło
źródło
Wiem, że to pytanie jest stare, ale natrafiłem na nie, szukając odpowiedzi na podobne pytanie. Pomyślałem, że podzielę się bardzo przydatną wskazówką, którą otrzymałem.
Podczas konwersji na int, po prostu dodaj
.5
do swojej wartości przed obniżeniem. Ponieważint
obniżenie do zawsze spada do niższej liczby (np.(int)1.7 == 1
), Jeśli twój numer jest.5
lub wyższy, dodanie.5
podniesie go do następnej liczby, a obniżenie doint
powinno zwrócić poprawną wartość. (np.(int)(1.8 + .5) == 2
)źródło
+ 0.5 * Math.Abs(d)
Metody w innych odpowiedziach generują,
OverflowException
jeśli wartość zmiennoprzecinkowa jest poza zakresem Int. https://docs.microsoft.com/en-us/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_źródło
W przypadku aparatu Unity użyj Mathf.RoundToInt .
Źródło
źródło
Opracowuję kalkulator naukowy z przyciskiem Int. Oto proste, niezawodne rozwiązanie:
Math.Round czasami daje nieoczekiwane lub niepożądane wyniki, a jawna konwersja na liczbę całkowitą (przez rzutowanie lub Convert.ToInt ...) często daje błędne wartości dla liczb o większej precyzji. Powyższa metoda wydaje się zawsze działać.
źródło