Як я можу перетворити довгий на 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.