Odpowiedzi:
Zaktualizowano w Javie 8:
Math.toIntExact(value);
Oryginalna odpowiedź:
Prosty typ odlewania powinien to zrobić:
long l = 100000;
int i = (int) l;
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.
Long x = 100L;
int y = x.intValue();
intValue()tu w tle rzuca, ma wartość… Tak?
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)
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 2147483647
long x=2147483648
int 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 '
Od wersji Java 8 możesz używać: Math.toIntExact (długa wartość)
Zobacz JavaDoc: Math.toIntExact
Zwraca wartość długiego argumentu; zgłaszanie wyjątku, jeśli wartość przepełnia wartość int.
Kod źródłowy Math.toIntExactw JDK 8:
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
W przypadku korzystania z biblioteki Guava , istnieją metody Ints.checkedCast(long)i Ints.saturatedCast(long)przekształcania longsię int.
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?
Możesz użyć Longopakowania zamiast operacji longpodstawowej i wywołania
Long.intValue()
To rund / obciąć longwartości odpowiednio dopasować w sposób int.
Jeśli bezpośredni rzutowanie pokazuje błąd, możesz to zrobić w następujący sposób:
Long id = 100;
int int_id = (int) (id % 100000);
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
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.
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:
val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
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 ();
Long l = 100;
int i = Math.round(l);
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);
