konwersja double na integer w java

114

W Javie chcę zamienić podwójną na liczbę całkowitą, wiem, czy zrobisz to:

double x = 1.5;
int y = (int)x;

otrzymujesz y = 1. Jeśli to zrobisz:

int y = (int)Math.round(x);

Prawdopodobnie dostaniesz 2. Jednak zastanawiam się: ponieważ podwójne reprezentacje liczb całkowitych wyglądają czasami jak 1,9999999998 lub coś podobnego, czy istnieje możliwość, że rzutowanie liczby podwójnej utworzonej za pomocą Math.round () nadal spowoduje skrócenie liczby w dół, a raczej niż zaokrąglona liczba, której szukamy (tj .: 1 zamiast 2 w przedstawionym kodzie)?

(i tak, mam na myśli to jako takie: czy jest jakaś wartość dla x, gdzie y pokaże wynik, który jest obciętą, a nie zaokrągloną reprezentacją x?)

Jeśli tak: czy istnieje lepszy sposób na zrobienie podwójnej liczby w zaokrągloną liczbę całkowitą bez ryzyka obcięcia?


Coś wymyśliłem: Math.round (x) zwraca long, a nie double. Stąd: Math.round () nie może zwrócić liczby wyglądającej jak 3.9999998. Dlatego int (Math.round ()) nigdy nie będzie musiało niczego obcinać i zawsze będzie działać.

vdMandele
źródło
6
Math.round (double) zwraca long, a nie double.
qbert220

Odpowiedzi:

95

czy istnieje możliwość, że rzucenie podwójnego utworzonego przez Math.round()nadal spowoduje skrócenie liczby w dół

Nie, round()zawsze zaokrągli podwójną wartość do prawidłowej wartości, a następnie zostanie rzutowana na wartość, longktóra obetnie wszelkie miejsca dziesiętne. Ale po zaokrągleniu nie pozostaną żadne części ułamkowe.

Oto dokumenty z Math.round(double):

Zwraca najbliższą długość argumentowi. Wynik zaokrągla się do liczby całkowitej, dodając 1/2, biorąc podłogę wyniku i rzutując wynik na typ long. Innymi słowy, wynik jest równy wartości wyrażenia:

(long)Math.floor(a + 0.5d)
jjnguy
źródło
3
Ważną kwestią jest to, że zaokrąglanie odbywa się metodą okrągłą. Zwracana jest długa wartość, którą można bezpiecznie rzutować na int (zakładając, że zwracana wartość zawsze będzie mieściła się w zakresie int).
qbert220
Tak. Nie mogę sobie wyobrazić / długo / sprawiających problemy. Oczywiście! Powinienem był to
wymyślić
1
Chociaż prawdą jest, że obcięcie nie nastąpi z powodu zaokrąglenia, nadal możesz nie uzyskać oczekiwanych wyników po prostu z powodu rzutowania z podwójnej, która jest bardzo dużą liczbą, [max double: 1.7976931348623157E308]do int, która jest znacznie mniejsza [max int: 2147483647]. Tylko coś do zapamiętania.
Nelda.techspiress
22

W przypadku typu danych Doubledo intmożna użyć:

Double double = 5.00;

int integer = double.intValue();
Charlie
źródło
Szuka zaokrąglonej wartości.
Markiz Lorne
1
Nie sądzę, że da to, czego się spodziewać za 4.99999999999 (da 4 nie 5)
Murkle
11
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

Rozwiązałem mój cel.

Nandkishor Gokhe
źródło