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


Ответы:


371

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

Math.toIntExact(value);

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

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

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

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

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


Какова точность целых чисел? о_О
Хачик

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();


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 '


Поэтому правильное преобразование будет состоять в том, чтобы определить, является ли преобразование безопасным, и в противном случае выдать исключение. Факт, изложенный @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;
}

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.


Это может быть хорошей идеей, чтобы ссылаться на текущую документацию, а также расширять ее - неизбежно будет некоторая степень округления при преобразовании 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)

Ты имеешь ввиду объявить это как Function<Long,Integer> function =?
Scratte

-1

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

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

longvalue.intvalue ();


Это неправильно, 3.120 не длинная, это двойное число или число с плавающей запятой.
Джордж Ксавье


-7

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

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

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

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


6
Spring может быть Java, но Java не Spring. «В Java есть» - ложное утверждение.
Гордон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.