Jakikolwiek sposób do obsady java.lang.Double
do java.lang.Integer
?
Zgłasza wyjątek
„java.lang.ClassCastException: java.lang.Double niezgodny z java.lang.Integer”
A Double
nie jest Integer
, więc obsada nie będzie działać. Zwróć uwagę na różnicę między Double
klasą a double
prymitywem . Zauważ też, że a Double
jest a Number
, więc ma metodę intValue
, której możesz użyć, aby uzyskać wartość jako prymityw int
.
intValue()
.intValue()
, po prostu rzucadouble
sięint
.Musisz jawnie uzyskać wartość int za pomocą metody intValue () w następujący sposób:
Lub
źródło
2^31 - 1 (Integer.MAX_VALUE)
przepełni się.1.6 -> 1
,1.4 -> 1
,-1.6 -> -1
,-1.4 -> -1
,Myślę, że niemożliwe jest zrozumienie innych odpowiedzi bez uwzględnienia pułapek i uzasadnienia .
Nie możesz bezpośrednio rzutować
Integer
naDouble
obiekt. RównieżDouble
iInteger
są niezmienne obiekty, więc nie można ich modyfikować w dowolny sposób.Każda klasa liczbowa ma prymitywną alternatywę (
Double
vsdouble
,Integer
vsint
, ...). Zauważ, że te prymitywy zaczynają się od małych liter (npint
.). To mówi nam, że nie są klasami / obiektami. Co oznacza również, że nie mają metod. Natomiast klasy (np.Integer
) Działają jak pudełka / opakowania wokół tych prymitywów, co umożliwia ich użycie jako obiektów.Strategia:
Aby przekonwertować
Double
na aInteger
, musisz przestrzegać tej strategii:Double
obiekt w prymitywdouble
. (= „unboxing”)double
na prymitywint
. (= „casting”)int
powrotem naInteger
obiekt. (= „boks”)W kodzie:
W rzeczywistości istnieje skrót. Możesz natychmiast rozpakować z
Double
prostej do prymitywnejint
. W ten sposób możesz całkowicie pominąć krok 2.Pułapki:
Istnieje jednak wiele rzeczy, które nie zostały omówione w powyższym kodzie. Powyższy kod nie jest bezpieczny.
Teraz działa dobrze dla większości wartości. Jednak liczby całkowite mają bardzo mały zakres (wartość min./maks.) W porównaniu do a
Double
. Ponadto w liczbach podwójnych mogą znajdować się także „wartości specjalne”, których liczby całkowite nie mogą:W zależności od aplikacji możesz dodać filtrowanie, aby uniknąć nieprzyjemnych wyjątków.
Kolejnym niedociągnięciem jest strategia zaokrąglania. Domyślnie Java zawsze będzie zaokrąglać w dół. Zaokrąglanie w dół ma sens we wszystkich językach programowania. Zasadniczo Java po prostu wyrzuca niektóre bajty. W aplikacjach finansowych na pewno będziesz chciał użyć zaokrąglania o pół w górę (np .:
round(0.5) = 1
iround(0.4) = 0
).Boks automatyczny (un)
Możesz mieć pokusę, aby użyć do tego automatycznego (lub) boksu , ale nie zrobiłbym tego. Jeśli utknąłeś już teraz, kolejne przykłady również nie będą tak oczywiste. Jeśli nie rozumiesz wewnętrznych zasad automatycznego (lub) boksu, nie używaj go.
Myślę, że poniższe rzeczy nie powinny być zaskoczeniem. Ale jeśli tak, to możesz przeczytać artykuł o przesyłaniu w Javie.
Preferuj wartość:
Nie kusz też, aby użyć
new Integer()
konstruktora (jak sugerują inne odpowiedzi). TevalueOf()
metody są lepsze, ponieważ używają buforowania. Dobrym nawykiem jest używanie tych metod, ponieważ od czasu do czasu oszczędzają ci trochę pamięci.źródło
Widzę trzy możliwości. Pierwsze dwa odcinają cyfry, ostatni zaokrągla do najbliższej liczby całkowitej.
źródło
Lubię to:
źródło
Rzeczywiście, najprostszym sposobem jest użycie
intValue()
. Zwraca to jednak tylko część całkowitą; nie zaokrągla. Jeśli chcesz, aby liczba całkowita była najbliższa wartości Double, musisz to zrobić:I nie zapomnij o zerowym przypadku:
Math.round()
obsługuje nieparzyste przypadki kaczek, takie jak nieskończoność i NaN, ze względną gracją.źródło
źródło
Po prostu zrób to w ten sposób ...
źródło
Należy również dodać, że działa z autoboxingiem.
W przeciwnym razie otrzymasz liczbę całkowitą (pierwotną), a następnie możesz uzyskać liczbę całkowitą:
źródło
new Integer(int)
, zamiast tego używajInteger.valueOf(int)
, który ma pamięć podręczną dla małych liczb całkowitych, takich jak ta.Wezwij
intValue()
swójDouble
obiekt.źródło
Można to zrobić za pomocą „Konwersji typu Zawężenie lub Jawne”, podwójne → długie → int. Mam nadzieję, że to zadziała.
PS: Daje 0, ponieważ double ma wszystkie wartości dziesiętne i nic po lewej stronie. W przypadku 0,58 zawęzi to do 0. Ale dla innych zrobi magię.
źródło
Spróbuj tego
źródło
Double i Integer są klasami opakowań dla prymitywów Java odpowiednio dla double i int. Możesz rzucać między nimi, ale stracisz zmiennoprzecinkowy. Oznacza to, że 5,4 rzutowane na int będzie wynosić 5. Jeśli rzucisz go z powrotem, będzie to 5.0.
źródło
Po prostu użyj metody intValue Double
źródło
Skorzystaj z
doubleNumber.intValue();
metodyźródło
Wydajna pamięć, ponieważ będzie współdzielić utworzoną już instancję Double.
źródło
Math.floor(...)
?intValue()
i tak zawsze podłogi.To zadziałało dla mnie. Spróbuj tego:
źródło