Как я могу конвертировать long в int в Java?

Ответы:

371

Обновлено в Java 8:

Math.toIntExact(value);

Оригинальный ответ:

Простое приведение типов должно сделать это:

long l = 100000;
int i = (int) l;

Обратите внимание, однако, что большие числа (обычно больше 2147483647и меньше чем -2147483648) будут терять некоторые биты и будут представлены неправильно.

Например, 2147483648будет представлен как -2147483648.

Frxstrem
источник
Какова точность целых чисел? о_О
Хачик
3
@khachik Я думаю, что точность равна 1. Или, может быть, 42, конечно :)
extraneon
7
Кастинг имеет разные значения для объектов и для примитивных типов. (int) Я не пытаюсь обработать 64-разрядное целое число как 32-разрядное целое, оно фактически возвращает другое 32-разрядное целое число с теми же 32-мя младшими битами. С объектами вы приводите к более конкретному дочернему классу, но с примитивными типами приведение - это не преобразование, а преобразование.
dspyz
Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Если преобразование не обнаружит в этом случае, что x имеет неправильное значение, то у вас нет решения.
raisercostin
Math.toIntExact () на самом деле отличный метод. Выдает исключение, если значение слишком велико, чтобы поместиться в int. Спасибо за предложение.
java-addict301
182
Long x = 100L;
int y = x.intValue();

Laxman
источник
3
Я бы сказал, что это будет лучшим способом.
Симант
В чем разница между этим способом и простым приведением значения? Я думаю, что все, что intValue()здесь, на заднем плане - это приведение значения.
Тим Виссманн
1
Обратите внимание на типы. Это не примитив longздесь. Это ссылочный тип, Longкоторый не может быть напрямую приведен к примитиву int. int y = (int)x;будет бросать, но int y = (int)(long)xбудет работать. (Причина в автобоксе)
акоп
58

Для небольших значений достаточно литья:

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 '

mndrix
источник
Поэтому правильное преобразование будет состоять в том, чтобы определить, является ли преобразование безопасным, и в противном случае выдать исключение. Факт, изложенный @Andrej Herich, который предложил библиотеку Guava.
raisercostin
55

Начиная с Java 8 вы можете использовать: Math.toIntExact (длинное значение)

См. JavaDoc: Math.toIntExact

Возвращает значение длинного аргумента; выдает исключение, если значение переполняет int.

Исходный код Math.toIntExactв JDK 8:

public static int toIntExact(long value) {
    if ((int)value != value) {
        throw new ArithmeticException("integer overflow");
    }
    return (int)value;
}
Kuchi
источник
37

Если вы используете библиотеку Guava , есть методы Ints.checkedCast(long)и Ints.saturatedCast(long)для преобразования longвint .

Андрей Херич
источник
4
Нет необходимости использовать библиотеки
Grekz
6
@Grekz, это до ОП. Я бы в этом случае. Больше банок зависимостей лучше, чем больше изобретенных колес, если у вас нет реальной причины не иметь больше банок зависимостей.
Джечлин
1
ИМХО, этот ответ намного лучше принятого в том, что он никогда не делает ничего неожиданного.
Марк Слейтер
5
Поскольку мой проект уже содержит этот jar-файл, было бы лучше использовать его, чем написать новый помощник
Osify
24
long x = 3;
int y = (int) x;

но это предполагает, что longможно представить как int, вы знаете разницу между ними?

Тео
источник
6
Интересно знать, что в соответствии с п. 5.1.3 в java.sun.com/docs/books/jls/third_edition/html/… (спецификации языка Java): несмотря на тот факт, что переполнение, недополнение или другая потеря информации могут происходят, сужение преобразований среди примитивных типов никогда не приводит к исключению времени выполнения (§11).
Extraneon
19

Вы можете использовать Longоболочку вместо longпримитива и вызова

Long.intValue()

Java7 intValue () документы

Это округляет / усекает longзначение соответственно, чтобы соответствовать в int.

eleonzx
источник
Это может быть хорошей идеей, чтобы ссылаться на текущую документацию, а также расширять ее - неизбежно будет некоторая степень округления при преобразовании long в int.
Макото
2
Глядя на реализацию Long 7.intValue () в Java 7, это просто приведение. Не выполняется проверка недопустимости / переполнения. Так что, по крайней мере, в Java 7, эта опция эквивалентна просто: (int) someLong.
buzz3791
почему меньше голосов? Я нашел этот самый ценный ответ
Ананд Дж. Кадхи
3

Если прямое приведение показывает ошибку, вы можете сделать это так:

Long id = 100;
int int_id = (int) (id % 100000);
Мохаммед Х
источник
2

В Java long - это 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 (включительно).

Поэтому, если ваш long находится за пределами значений, разрешенных для int, вы не получите полноценного преобразования.

Подробности о размерах примитивных типов Java здесь:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Алексис Дафреной
источник
1
На вопрос я уже ответил, когда увидел его, но предмет ограничений не был объяснен. Что я и сделал тогда. Если вы думаете, что это «бла бла бла», это означает, что вы просто гений, который может обходиться без подобных вещей, но для нас, простых людей, объяснение может быть полезным. Спасибо за ваш "вклад" ...
Алексис Дафреной
1

В Java 8 я делаю следующим образом

long l = 100L;
int i = Math.toIntExact(l);

Этот метод выдает, ArithmaticExceptionесли longзначение превышает диапазон int. Таким образом, я в безопасности от потери данных.

Эмдадул Савон
источник
0

Если вы хотите сделать безопасное преобразование и наслаждаться использованием Java8 с лямбда-выражением, вы можете использовать его следующим образом:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)
user13651274
источник
Ты имеешь ввиду объявить это как Function<Long,Integer> function =?
Scratte
-1

длинный х = 3120 л; // принять любое длинное значение int z = x.intValue (); // вы также можете конвертировать double в int таким же образом

если вам нужно скрыть напрямую, то

longvalue.intvalue ();

MANOJ G
источник
Это неправильно, 3.120 не длинная, это двойное число или число с плавающей запятой.
Джордж Ксавье
-4
Long l = 100;
int i = Math.round(l);
Кристиан Драча
источник
-7

Весной есть строгий способ конвертировать long в int

не только lnog может конвертировать в int, любой тип расширяет класс Number может конвертировать в другой тип Number в общем, здесь я покажу вам, как конвертировать long в int, другой тип наоборот.

Long l = 1234567L;
int i = org.springframework.util.NumberUtils.convertNumberToTargetClass(l, Integer.class);

конвертировать долго в int

tsaowe
источник
6
Spring может быть Java, но Java не Spring. «В Java есть» - ложное утверждение.
Гордон