Java에서 long을 int로 변환하려면 어떻게해야합니까?


답변:


371

Java 8에서 업데이트되었습니다.

Math.toIntExact(value);

원래 답변 :

간단한 유형 캐스팅이 수행해야합니다.

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

그러나 큰 숫자 (일반적으로보다 크 2147483647거나 작은 -2147483648)는 일부 비트를 잃고 잘못 표시됩니다.

예를 들어 2147483648로 표시됩니다 -2147483648.


정수의 정밀도는 무엇입니까? o_O
khachik

3
@khachik 나는 정밀도가 1 또는 :) 물론 아마 42 생각
extraneon

7
캐스팅은 객체와 기본 유형에 대해 다른 의미를 갖습니다. (int) l 64 비트 정수를 32 비트 정수로 취급하지 않고 실제로는 32 개의 하위 비트가 동일한 다른 32 비트 정수를 반환합니다. 객체를 사용하면 더 구체적인 하위 클래스로 캐스트 할 수 있지만 원시 유형에서는 캐스트가 실제로 캐스트가 아니라 변환입니다.
dspyz

Int x = (int) (((Long) 정수 .MAX_INTEGER) +10); 이 경우 변환에서 x가 부적절한 값을 가지고 있음을 감지하지 못하면 해결책이 없습니다.
raisercostin

Math.toIntExact ()는 실제로 훌륭한 방법입니다. 값이 너무 커서 int에 맞지 않으면 예외가 발생합니다. 제안 해 주셔서 감사합니다.
java-addict301

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


3
나는 이것이 최선의 방법이라고 말할 것입니다.
Simmant

이 방법과 단순히 가치를 캐스팅하는 것의 차이점은 무엇입니까? 제 생각에, intValue()배경에서 여기있는 모든 것은 가치를 전달하는 것입니다.
Tim Wißmann

1
유형을 참고하십시오. long여기서는 기본이 아닙니다 . Long프리미티브로 직접 캐스트 할 수없는 참조 유형 입니다 int. int y = (int)x;execption을 throw하지만 int y = (int)(long)x작동합니다. (이유는 오토 박싱)
akop

58

작은 값의 경우 캐스팅으로 충분합니다.

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

그러나,이 long보다 더 많은 정보를 저장할 수 int는 완벽하게 변환 할 수 없습니다, 그래서 longint일반적인 경우. 는 경우 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 (long value)

JavaDoc : Math.toIntExact를 참조하십시오.

long 인수의 값을 반환합니다. 값이 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)longint


4
라이브러리를 사용할 필요가 없습니다
Grekz

6
@Grekz는 OP에 달려 있습니다. 이 경우에하겠습니다. 더 많은 의존성 항아리를 가지지 않는 실제 이유가 없다면 더 많은 의존성 항아리가 재개발 된 바퀴보다 낫습니다.
djechlin

1
IMHO,이 대답은 예기치 않은 것을 결코 수행하지 않는다는 점에서 허용되는 것보다 훨씬 좋습니다.
Mark Slater

5
내 프로젝트에 이미 해당 항아리가 포함되어 있으므로 새 도우미를 작성하는 것보다 항아리를 사용하는 것이 더 유리합니다.
Osify

24
long x = 3;
int y = (int) x;

그러나는가로 long표현 될 수 있다고 가정합니다 int. 둘 사이의 차이점을 알고 있습니까?


6
java.sun.com/docs/books/jls/third_edition/html/의 파 5.1.3에 따르면… (Java 언어 사양) : 오버플로, 언더 플로 또는 기타 정보 손실이있을 수 있음에도 불구하고 프리미티브 유형 간의 변환이 좁아지면 런타임 예외가 발생하지 않습니다 (§11).
extraneon

18

기본 및 호출 Long대신 래퍼를 사용할 수 있습니다long

Long.intValue()

Java7 intValue () 문서

long에 맞게 값을 반올림 / 잘라냅니다 int.


현재 문서에 링크하고 이것을 확장하는 것이 좋습니다. 필연적으로 long을 int로 변환 할 때 어느 정도의 반올림이있을 것입니다.
Makoto

2
Long.intValue ()의 Java 7 구현을 살펴보면 캐스팅입니다. 언더 플로우 / 오버 플로우 검사가 구현되지 않았습니다. 따라서 적어도 Java 7을 통해이 옵션은 다음과 같습니다. (int) someLong.
buzz3791

왜 공언이 적습니까? 나는 가장 가치있는 대답이 하나 발견
아난드의 J를. Kadhi

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
이 질문은 내가 보았을 때 이미 답변되었지만 변환의 한계에 대한 주제는 설명되지 않았습니다. 그때 내가 한 일. 그것이 "bla bla bla"이라고 생각한다면, 그것은 당신이 그런 종류의 일없이 갈 수있는 일종의 천재라는 것을 의미하지만, 우리에게는 단지 인간에 대한 설명이 유용 할 수 있습니다. 당신의 "입력"에 감사합니다 ...
Alexis Dufrenoy

1

Java 8 에서는 다음과 같은 방식으로 수행합니다.

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

이 메소드는 값이 범위를 초과 ArithmaticException하면 발생 long합니다 int. 따라서 데이터 손실로부터 안전합니다.


0

안전하게 변환하고 Lambda 표현식과 함께 Java8을 사용하려면 다음과 같이 사용할 수 있습니다.

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

당신은 그것을 선언하는 것을 의미 Function<Long,Integer> function =합니까?
Scratte

-1

긴 x = 3120L; // 긴 값을 취합니다. int z = x.intValue (); // 같은 방법으로 double을 int로 변환 할 수 있습니다

당신이 직접 은밀해야 할 경우

longvalue.intvalue ();


이것은 잘못되었습니다. 3.120은 길지 않습니다. 더블 또는 부동 소수점 숫자입니다.
George Xavier


-7

봄에는 long을 int로 변환하는 엄격한 방법이 있습니다.

lnog는 int로 변환 할 수있을뿐만 아니라 모든 유형의 클래스 확장 Number는 일반적으로 다른 Number 유형으로 변환 할 수 있습니다. 여기서 long을 int로 변환하는 방법을 보여 주며 다른 유형도 그 반대로 변환합니다.

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

long을 int로 변환


6
Spring은 Java 일 수 있지만 Java는 Spring이 아닙니다. "자바에는있다"는 잘못된 진술이다.
Gordon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.