Należy jednak pamiętać, że duże liczby (zwykle większe niż 2147483647i mniejsze niż -2147483648) utracą niektóre bity i będą niepoprawnie reprezentowane.
Na przykład 2147483648byłby reprezentowany jako -2147483648.
@khachik Myślę, że precyzja wynosi 1. A może 42 oczywiście :)
extraneon
7
Rzutowanie ma różne znaczenie dla obiektów i typów prymitywnych. (int) l nie próbuje traktować 64-bitowej liczby całkowitej jako 32-bitowej liczby całkowitej, w rzeczywistości zwraca inną 32-bitową liczbę całkowitą z tymi samymi 32 bitami niższego rzędu. W przypadku obiektów rzutujesz na bardziej określoną klasę potomną, ale w przypadku typów pierwotnych rzutowanie nie jest tak naprawdę rzutowaniem, ale konwersją.
dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Jeśli konwersja nie wykryje w tym przypadku, że x ma niepoprawną wartość, to nie masz rozwiązania.
raisercostin
Math.toIntExact () jest w rzeczywistości świetną metodą. Zgłasza i wyjątek, jeśli wartość jest zbyt duża, aby zmieścić się w wartości int. Dzieki za sugestie.
Jaka jest różnica między tym sposobem a po prostu rzuceniem wartości? Myślę, że wszystko, co intValue()tu w tle rzuca, ma wartość… Tak?
Tim Wißmann
1
Zwróć uwagę na typy. To nie jest prymitywne longtutaj. Jest to typ odniesienia, Longktóry nie może bezpośrednio rzutować na prymityw int. int y = (int)x;wyrzuci wykonanie, ale int y = (int)(long)xzadziała. (Powodem jest autoboxing)
akop
58
W przypadku małych wartości wystarczy rzutowanie:
long l =42;int i =(int) l;
Jednak longmoże zawierać więcej informacji niż an int, więc w ogólnym przypadku nie można idealnie przekonwertować z longna int. Jeśli longliczba jest mniejsza lub równa Integer.MAX_VALUE, możesz ją przekonwertować, przesyłając bez utraty jakichkolwiek informacji.
Na przykład następujący przykładowy kod:
System.out.println("largest long is "+Long.MAX_VALUE );System.out.println("largest int is "+Integer.MAX_VALUE );long x =(long)Integer.MAX_VALUE;
x++;System.out.println("long x="+ x);int y =(int) x;System.out.println("int y="+ y);
produkuje następujące dane wyjściowe na moim komputerze:
largest long is 9223372036854775807
largest int is 2147483647long x=2147483648int y=-2147483648
Zwróć uwagę na znak ujemny na y. Ponieważ xposiadał wartość o jeden większą niż Integer.MAX_VALUE, int ynie mógł go utrzymać. W tym przypadku zawinął się do liczb ujemnych.
Jeśli chcesz samodzielnie zająć się tą sprawą, możesz zrobić coś takiego:
if( x >(long)Integer.MAX_VALUE ){// x is too big to convert, throw an exception or something useful}else{
y =(int)x;}
Wszystko to zakłada liczby dodatnie. W przypadku liczb ujemnych użyj MIN_VALUEzamiast `MAX_VALUE '
Tak więc poprawną konwersją będzie wykrycie, czy konwersja jest bezpieczna i odrzucenie wyjątku w inny sposób. Fakt podany przez @Andreja Hericha, który sugerował bibliotekę Guava.
raisercostin
55
Od wersji Java 8 możesz używać: Math.toIntExact (długa wartość)
@Grekz to zależy od OP. Zrobiłbym w tym przypadku. Więcej słoików zależności jest lepszych niż więcej wymyślonych kół, chyba że masz rzeczywisty powód, aby nie mieć więcej słoików zależności.
djechlin
1
IMHO, ta odpowiedź jest znacznie lepsza niż zaakceptowana, ponieważ nigdy nie robi czegoś nieoczekiwanego.
Mark Slater,
5
Ponieważ mój projekt zawiera już ten słoik, korzystniej byłoby go użyć niż napisać nowego pomocnika
Osify
24
long x =3;int y =(int) x;
ale zakłada to, że longmożna to przedstawić jako int, czy znasz różnicę między nimi?
Interesujące jest to, że zgodnie z par 5.1.3 w java.sun.com/docs/books/jls/third_edition/html/… (Specyfikacja języka Java): Pomimo faktu, że przepełnienie, niedopełnienie lub inna utrata informacji może występuje, zawężenie konwersji między typami pierwotnymi nigdy nie powoduje wyjątku w czasie wykonywania (§11).
extraneon
18
Możesz użyć Longopakowania zamiast operacji longpodstawowej i wywołania
Dobrym pomysłem może być link do bieżącej dokumentacji, a także jej rozwinięcie - nieuchronnie będzie zaokrąglanie przy konwersji długiej na int.
Makoto
2
Patrząc na implementację Long.intValue () w Javie 7, to tylko rzutowanie. Nie jest stosowane sprawdzanie niedopełnienia / przepełnienia. Tak więc przynajmniej przez Javę 7 ta opcja jest odpowiednikiem tylko: (int) someLong.
buzz3791
dlaczego mniej pozytywnych opinii? Znalazłem jedną z najcenniejszych odpowiedzi
Anand J. Kadhi
3
Jeśli bezpośredni rzutowanie pokazuje błąd, możesz to zrobić w następujący sposób:
W Javie długi jest liczbą 64-bitową ze znakiem, co oznacza, że możesz przechowywać liczby od -9 223 372,036,854,775,808 do 9 223 372,036,854,775,807 (włącznie).
Z drugiej strony, int jest oznaczony liczbą 32-bitową, co oznacza, że możesz przechowywać liczbę między -2 147 483 648 a 2 147 483 647 (włącznie).
Więc jeśli twój long jest poza wartościami dopuszczalnymi dla int, nie uzyskasz wartościowej konwersji.
Szczegóły dotyczące rozmiarów prymitywnych typów Java tutaj:
Odpowiedzi na pytanie już udzieliłem w chwili, gdy je zobaczyłem, ale temat granic konwersji nie został wyjaśniony. Co wtedy zrobiłem. Jeśli uważasz, że to „bla bla bla”, oznacza to tylko, że jesteś jakimś geniuszem, który może się obejść bez tego rodzaju rzeczy, ale dla nas, zwykłych ludzi, wyjaśnienie może być przydatne. Dziękuję za „wejście” ...
Alexis Dufrenoy,
1
W Javie 8 robię to w następujący sposób
long l =100L;int i =Math.toIntExact(l);
Ta metoda wyrzuca, ArithmaticExceptionjeśli longwartość przekroczy zakres int. Dlatego jestem bezpieczny przed utratą danych.
Na wiosnę istnieje rygorystyczny sposób konwersji długiej na int
nie tylko lnog może konwertować na int, każdy typ rozszerza klasę Liczba może konwertować na inny typ liczbowy ogólnie, tutaj pokażę, jak przekonwertować long na int, inny typ vice versa.
Long l =1234567L;int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l,Integer.class);
Odpowiedzi:
Zaktualizowano w Javie 8:
Oryginalna odpowiedź:
Prosty typ odlewania powinien to zrobić:
Należy jednak pamiętać, że duże liczby (zwykle większe niż
2147483647
i mniejsze niż-2147483648
) utracą niektóre bity i będą niepoprawnie reprezentowane.Na przykład
2147483648
byłby reprezentowany jako-2147483648
.źródło
źródło
intValue()
tu w tle rzuca, ma wartość… Tak?long
tutaj. Jest to typ odniesienia,Long
który nie może bezpośrednio rzutować na prymitywint
.int y = (int)x;
wyrzuci wykonanie, aleint y = (int)(long)x
zadziała. (Powodem jest autoboxing)W przypadku małych wartości wystarczy rzutowanie:
Jednak
long
może zawierać więcej informacji niż anint
, więc w ogólnym przypadku nie można idealnie przekonwertować zlong
naint
. Jeślilong
liczba jest mniejsza lub równaInteger.MAX_VALUE
, możesz ją przekonwertować, przesyłając bez utraty jakichkolwiek informacji.Na przykład następujący przykładowy kod:
produkuje następujące dane wyjściowe na moim komputerze:
Zwróć uwagę na znak ujemny na
y
. Ponieważx
posiadał wartość o jeden większą niż Integer.MAX_VALUE,int y
nie mógł go utrzymać. W tym przypadku zawinął się do liczb ujemnych.Jeśli chcesz samodzielnie zająć się tą sprawą, możesz zrobić coś takiego:
Wszystko to zakłada liczby dodatnie. W przypadku liczb ujemnych użyj
MIN_VALUE
zamiast `MAX_VALUE 'źródło
Od wersji Java 8 możesz używać: Math.toIntExact (długa wartość)
Zobacz JavaDoc: Math.toIntExact
Kod źródłowy
Math.toIntExact
w JDK 8:źródło
W przypadku korzystania z biblioteki Guava , istnieją metody
Ints.checkedCast(long)
iInts.saturatedCast(long)
przekształcanialong
sięint
.źródło
ale zakłada to, że
long
można to przedstawić jakoint
, czy znasz różnicę między nimi?źródło
Możesz użyć
Long
opakowania zamiast operacjilong
podstawowej i wywołaniaDokumenty Java7 intValue ()
To rund / obciąć
long
wartości odpowiednio dopasować w sposóbint
.źródło
Jeśli bezpośredni rzutowanie pokazuje błąd, możesz to zrobić w następujący sposób:
źródło
W Javie długi jest liczbą 64-bitową ze znakiem, co oznacza, że możesz przechowywać liczby od -9 223 372,036,854,775,808 do 9 223 372,036,854,775,807 (włącznie).
Z drugiej strony, int jest oznaczony liczbą 32-bitową, co oznacza, że możesz przechowywać liczbę między -2 147 483 648 a 2 147 483 647 (włącznie).
Więc jeśli twój long jest poza wartościami dopuszczalnymi dla int, nie uzyskasz wartościowej konwersji.
Szczegóły dotyczące rozmiarów prymitywnych typów Java tutaj:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
źródło
W Javie 8 robię to w następujący sposób
Ta metoda wyrzuca,
ArithmaticException
jeślilong
wartość przekroczy zakresint
. Dlatego jestem bezpieczny przed utratą danych.źródło
Jeśli chcesz dokonać bezpiecznej konwersji i cieszyć się użyciem Java8 z wyrażeniem Lambda, możesz użyć go w następujący sposób:
źródło
Function<Long,Integer> function =
?długie x = 3120L; // weź dowolną długą wartość int z = x.intValue (); // możesz przekonwertować double na int również w ten sam sposób
jeśli trzeba to ukryć bezpośrednio, to
longvalue.intvalue ();
źródło
źródło
Na wiosnę istnieje rygorystyczny sposób konwersji długiej na int
nie tylko lnog może konwertować na int, każdy typ rozszerza klasę Liczba może konwertować na inny typ liczbowy ogólnie, tutaj pokażę, jak przekonwertować long na int, inny typ vice versa.
źródło