Як я можу перетворити довгий на int в Java?


Відповіді:


371

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

Math.toIntExact(value);

Оригінальний відповідь:

Простий тип кастингу повинен робити це:

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

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

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


Яка точність цілих чисел? o_O
хачик

3
@khachik Я думаю, що точність - 1. А може, 42, звичайно :)
екстранеон

7
Кастинг має різні значення як для предметів, так і для примітивних типів. (int) Я не намагаюся розглядати 64-розрядне ціле число як 32-бітове ціле число, воно фактично повертає інше 32-бітове ціле число з тими ж 32 бітами нижнього порядку. З об’єктами ви переходите до більш конкретного дочірнього класу, але з типами примітів, акторський склад - це насправді не акторський склад, а перетворення.
dspyz

Int x = (int) (((Long) Integer.MAX_INTEGER) +10); Якщо в даному випадку конверсія не виявить, що x має неправильне значення, у вас немає рішення.
рейдеркостін

Math.toIntExact () - насправді чудовий метод. Він кидає і виняток, якщо значення занадто велике, щоб вмістити в int. Дякую за пропозицію.
java-addict301

182
Long x = 100L;
int y = x.intValue();


3
Я б сказав, що це буде найкращий спосіб.
Simmant

Яка різниця між цим способом і просто простою цінністю? Я думаю, що все те, що intValue()робиться тут на задньому плані, - це значення.
Тім Вісманн

1
Зверніть увагу на типи. Тут не примітив long. Референтний тип, Longякий не може бути безпосередньо примитивним int. int y = (int)x;буде кидати виконання, але int y = (int)(long)xбуде працювати. (Причина в автобоксінгу)
akop

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.
рейдеркостін

55

З Java 8 ви можете використовувати: Math.toIntExact (велике значення)

Див. JavaDoc: Math.toIntExact

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

Вихідний код Math.toIntExactJDK 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
Немає необхідності користуватися бібліотеками
Грекз

6
@ Грекз, це до OP. Я б у цьому випадку. Більше банок залежностей краще, ніж більше винаходили колеса, якщо у вас немає фактичної причини не мати більше залежних банок.
djechlin

1
ІМХО, ця відповідь набагато краща за прийняту, оскільки вона ніколи не робить чогось несподіваного.
Марк Слейтер

5
Оскільки мій проект уже містить цю банку, то
корисніше

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).
екстранеон

18

Можна використовувати Longобгортку замість longпримітиву та дзвонити

Long.intValue()

Документи Java7 intValue ()

Він округляє / обрізає longзначення відповідно, щоб вписатись у int.


Може бути хорошою ідеєю зв’язати поточну документацію, а також розширити цю проблему - неминуче буде певна ступінь округлення при перетворенні довгого в Int.
Макото

2
Дивлячись на реалізацію Java 7 Long.intValue (), це просто кастинг. Не проводиться перевірка під / переповнення. Так що принаймні через Java 7 цей варіант еквівалентний просто: (int) someLong.
buzz3791

чому менше оплати? Я знайшов цю одну з найцінніших відповідей
Anand j. Kadhi

3

Якщо прямий кастинг показує помилку, ви можете це зробити так:

Long id = 100;
int int_id = (int) (id % 100000);

2

У 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


1
На це питання вже відповідали в той момент, коли я його бачив, але тема меж конверсії не була пояснена. Що я робив тоді. Якщо ви думаєте, що це "бла-бла-бла", це означає лише, що ви якийсь геній, який може обійтися без подібних речей, але для нас, простих людей, пояснення може бути корисним. Дякую за Ваш "внесок" ...
Алексіс Дуфреной

1

У Java 8 я роблю таким чином

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

Цей метод кидає, ArithmaticExceptionякщо longзначення перевищує діапазон int. Таким чином, я захищений від втрати даних.


0

Якщо ви хочете зробити безпечну конверсію і насолоджуватися використанням Java8 з виразом Lambda, ви можете використовувати її так:

val -> Optional.ofNullable(val).map(Long::intValue).orElse(null)

Ви маєте на увазі заявити про це як Function<Long,Integer> function =?
Scratte

-1

довгий х = 3120Л; // прийняти будь-яке довге значення int z = x.intValue (); // Ви можете конвертувати подвійний в int також таким же чином

якщо вам потрібно приховувати безпосередньо тоді

longvalue.intvalue ();


Це неправильно, 3.120 - це недовго, це подвійне чи число з плаваючою комою.
Джордж Ксав'є


-7

Навесні існує жорсткий спосіб перетворення довгого в Int

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

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

перетворити довго в int


6
Весна може бути Java, але Java - це не Весна. "У java, є" є хибним твердженням.
Гордон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.