Відповіді:
Оновлено на Java 8:
Math.toIntExact(value);
Оригінальний відповідь:
Простий тип кастингу повинен робити це:
long l = 100000;
int i = (int) l;
Однак зауважте, що велика кількість (як правило, більша 2147483647і менша за -2147483648) втратить частину бітів і буде представлена неправильно.
Наприклад, 2147483648буде представлено як -2147483648.
Long x = 100L;
int y = x.intValue();
intValue()робиться тут на задньому плані, - це значення.
long. Референтний тип, Longякий не може бути безпосередньо примитивним int. int y = (int)x;буде кидати виконання, але int y = (int)(long)xбуде працювати. (Причина в автобоксінгу)
Для невеликих значень достатньо лиття:
long l = 42;
int i = (int) l;
Тим НЕ менше, longможе містити більше інформації , ніж int, так що це не можливо , щоб повністю конвертувати longв int, в загальному випадку. Якщо число longмає менше або рівне, Integer.MAX_VALUEви можете перетворити його, передаваючи без втрати будь-якої інформації.
Наприклад, наступний зразок коду:
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);
видає такий результат на моїй машині:
largest long is 9223372036854775807
largest int is 2147483647
long x=2147483648
int y=-2147483648
Помітьте негативний знак на y. Оскільки xзначення, яке було більше, ніж Integer.MAX_VALUE, int yне змогло його утримати. У цьому випадку він завернувся до від’ємних цифр.
Якщо ви хочете вирішити цю справу самостійно, ви можете зробити щось на кшталт:
if ( x > (long)Integer.MAX_VALUE ) {
// x is too big to convert, throw an exception or something useful
}
else {
y = (int)x;
}
Все це передбачає додатні цифри. Для від'ємних чисел використовуйте MIN_VALUEзамість "MAX_VALUE"
З Java 8 ви можете використовувати: Math.toIntExact (велике значення)
Повертає значення довгого аргументу; викидання виключення, якщо значення переповнює int.
Вихідний код Math.toIntExactJDK 8:
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
Якщо використовується бібліотека Guava , існують методи Ints.checkedCast(long)і Ints.saturatedCast(long)для перетворення longна int.
long x = 3;
int y = (int) x;
але це передбачає, що longможе бути представлений у вигляді int, ви знаєте різницю між ними?
Можна використовувати Longобгортку замість longпримітиву та дзвонити
Long.intValue()
Він округляє / обрізає longзначення відповідно, щоб вписатись у int.
Якщо прямий кастинг показує помилку, ви можете це зробити так:
Long id = 100;
int int_id = (int) (id % 100000);
У Java довгий - це підписаний 64-бітний номер, а це означає, що ви можете зберігати номери між -9,223,372,036,854,775,808 та 9,223,372,036,854,775,807 (включно).
З іншого боку, int має 32-бітове число, що означає, що ви можете зберігати число від -2,147,483,648 до 2,147,483,647 (включно).
Отже, якщо ваше довге значення перебуває поза значеннями, дозволеними для int, ви не отримаєте цінної конверсії.
Деталі про розміри примітивних типів Java тут:
http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
У Java 8 я роблю таким чином
long l = 100L;
int i = Math.toIntExact(l);
Цей метод кидає, ArithmaticExceptionякщо longзначення перевищує діапазон int. Таким чином, я захищений від втрати даних.
Якщо ви хочете зробити безпечну конверсію і насолоджуватися використанням Java8 з виразом Lambda, ви можете використовувати її так:
val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
Function<Long,Integer> function =?
довгий х = 3120Л; // прийняти будь-яке довге значення int z = x.intValue (); // Ви можете конвертувати подвійний в int також таким же чином
якщо вам потрібно приховувати безпосередньо тоді
longvalue.intvalue ();
Long l = 100;
int i = Math.round(l);
Навесні існує жорсткий спосіб перетворення довгого в Int
не тільки lnog може перетворити в int, будь-який тип розширення класу Number може перетворити на інший тип номера взагалі, тут я покажу вам, як перетворити long в int, інший тип навпаки.
Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);
