Java에서 Double을 정수로 캐스트


348

에 캐스팅 java.lang.Double하는 방법 java.lang.Integer?

예외가 발생합니다

"java.lang.ClassCastException : java.lang.Double과 호환되지 않는 java.lang.Integer"

답변:


464

A Double는 님이 아니므로 Integer캐스트가 작동하지 않습니다. Double 클래스double 프리미티브 의 차이점에 유의하십시오 . 또한이 점에 유의 DoubleA는 Number, 그 방법이있다, 그래서 intValue 당신이 프리미티브 값을 얻기 위해 사용할 수 있습니다 int.


2
캐스트하지 마십시오. 예를 들어 13.22222가 아니라 13에서 Double에서 Integer 객체를 가져와야합니다.
4lex1v

181
단지 전화 intValue()후.
hvgotcodes

6
널을 처리하는 것을 잊지 마십시오.
pimlottc

13
이것은 단지 Double의 정수 부분을 반환하므로 13.666667 또는 13.9의 경우 14가 아니라 13이됩니다. 가장 가까운 정수 를 원하면 내 대답을 참조하십시오. stackoverflow.com/a/24816336/1450294
Michael Scheper

2
당신의 구현 보면 intValue(), 그것은 단지 캐스트 doubleint.
carlo.marinangeli

566

다음과 같이 intValue () 메소드를 사용하여 명시 적으로 int 값을 가져와야합니다.

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

또는

double d = 5.25;
int i = (int) d;

67
감사합니다. 매우 명확한. 나를 위해 받아 들여진 대답은 바보 같은 질문을하는 것에 대해 꾸짖는 것 같습니다. 그러나 당신의 대답은 매우 관대합니다.
Buddhika Ariyaratne

2
이중 값이 정수 범위를 벗어나면 어떻게됩니까? (예 : 2 ^ 33)
nikdeapen

5
double 값 2^31 - 1 (Integer.MAX_VALUE)이 초과되면 오버플로됩니다.
anubhava

3
그리고 double에서 int로 캐스팅 할 때 정수 부분과 양수 모두 정수 부분 만 유지하고 반올림에 신경 쓰지 않습니다. 예를 들어 1.6 -> 1, 1.4 -> 1, -1.6 -> -1, -1.4 -> -1,
에릭 왕

51

함정과 추론을 다루지 않고 다른 답변을 이해하는 것은 불가능하다고 생각합니다. 뒤에 합니다.

당신은 직접 캐스팅 할 수없는 IntegerA와 Double객체입니다. 또한 DoubleInteger 당신이 어떤 방식으로 수정할 수 있도록, 불변의 객체입니다.

각 숫자 클래스 에는 기본 대안이 있습니다 ( Doublevs double, Integervs int, ...). 이 기본 요소는 소문자 (예 :)로 시작 int합니다. 그것은 그들이 클래스 / 객체가 아니라는 것을 알려줍니다. 또한 메소드가 없다는 것을 의미합니다. 반대로 클래스 (예 Integer:)는 이러한 기본 요소 주위의 상자 / 래퍼처럼 작동하므로 객체처럼 사용할 수 있습니다.

전략:

를 변환하려면 DoubleInteger이 전략을 수행해야합니다 :

  1. Double객체를 프리미티브로 변환합니다 double. (= "unboxing")
  2. 프리미티브 double를 프리미티브 로 변환합니다 int. (= "캐스팅")
  3. 기본 요소를 int다시 Integer오브젝트 로 변환하십시오 . (= "권투")

코드에서 :

// starting point
Double myDouble = Double.valueOf(10.0);

// step 1: unboxing
double dbl = myDouble.doubleValue();

// step 2: casting
int intgr = (int) dbl;

// step 3: boxing
Integer val = Integer.valueOf(intgr);

실제로 지름길이 있습니다. Double직선에서 기본 까지 즉시 개봉 할 수 있습니다 int. 이렇게하면 2 단계를 완전히 건너 뛸 수 있습니다.

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

함정 :

그러나 위의 코드에서 다루지 않은 많은 것들이 있습니다. 위의 코드는 null 안전하지 않습니다.

Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException

// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());

이제 대부분의 값에 적합합니다. 그러나 정수는에 비해 매우 작은 범위 (최소 / 최대 값)를 갖습니다 Double. 또한 double은 "특수 값"을 보유 할 수 있으며 정수는 다음을 수행 할 수 없습니다.

  • 1/0 = + 무한
  • -1/0 =-무한
  • 0/0 = 정의되지 않음 (NaN)

따라서 응용 프로그램에 따라 불쾌한 예외를 피하기 위해 필터링을 추가 할 수 있습니다.

그런 다음 다음 단점은 반올림 전략입니다. 기본적으로 Java는 항상 내림합니다. 반올림은 모든 프로그래밍 언어에서 완벽하게 이해됩니다. 기본적으로 Java는 일부 바이트를 버리고 있습니다. 금융 응용 프로그램에서는 반드시 반올림을 사용해야합니다 (예 : round(0.5) = 1round(0.4) = 0).

// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);

복싱 (자동)

당신은 이것에 자동 (un) 권투 를 사용 하고 싶을 수도 있지만, 그렇지 않습니다. 이미 고착되어 있다면 다음 예제는 그다지 명백하지 않을 것입니다. 자동 (un) 복싱의 내부 동작을 이해하지 못하면 사용하지 마십시오.

Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work

Double val3 = 10; // doesn't work
Double val4 = 10.0; // works

Double val5 = null; 
double val6 = val5; // doesn't work (throws a NullPointerException)

다음은 놀라운 일이 아닙니다. 그러나 그렇다면 Java 캐스팅에 관한 기사를 읽으십시오.

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

valueOf를 선호하십시오 :

또한 new Integer()다른 답변이 제안하는 것처럼 생성자 를 사용하려고 유혹하지 마십시오 . valueOf()가 캐싱을 사용하기 때문에 방법이 더 낫다. 이러한 방법을 사용하는 것은 좋은 습관입니다. 때때로 메모리를 절약 할 수 있기 때문입니다.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory

1
내 의견으로는 이것이 최선의 대답이다
Thor

39

세 가지 가능성이 있습니다. 처음 두 자리는 숫자를 잘라 내고, 마지막 두 자리는 가장 가까운 정수로 반올림합니다.

double d = 9.5;
int i = (int)d;
//i = 9

Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9

double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10

21
결과를 primitieve int에 저장하려는 경우 Integer.valueOf가 필요하지 않습니다. 귀하의 코드는 Java가 불필요한 상자 및 상자를 해제하도록 강제합니다.
bvdb


23

실제로 가장 간단한 방법은을 사용하는 것 intValue()입니다. 그러나 이것은 정수 부분 만 반환합니다. 반올림하지 않습니다. 정수 를 Double 값에 가장 가깝게 하려면 다음을 수행해야합니다.

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

그리고 null 경우를 잊지 마십시오.

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() 무한대 및 NaN과 같은 이상한 오리 사례를 상대적인 은혜로 처리합니다.


2
Math.round 결과를 int로 캐스팅하면 왜 Integer.valueOf가 필요합니까?
Eran H.

@EranH .: Java 1.5부터는 그렇지 않을 것입니다. 오토 박싱은 코드가 같은 방식으로 끝날 가능성이 높다는 것을 의미합니다. 그러나 객체와 프리미티브를 아직 파악하지 않은 사람들에게는이 코드가 더 명확하다고 생각합니다.
Michael Scheper

이 답변을 다운 투표 한 사람 : 이유를 설명하면 커뮤니티를 훨씬 더 많이 도울 수 있고 왜 그것이 효과가 없는지 알아내는 데 도움이 될 수도 있습니다. OTOH라는 설명이없는 다운 투표는 모든 사람에게 도움이되지 않으며 비겁한 태도를 보입니다.
Michael Scheper 2016 년

14
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13

2
문제는 래퍼 클래스에 관한 것입니다. 이 답변은 프리미티브에 관한 것입니다.
Michael Scheper

8

이렇게하면됩니다 ...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);

7
Double d = 100.00;
Integer i = d.intValue();

또한 오토 박싱과 함께 작동한다고 덧붙여 야합니다.

그렇지 않으면 int (primitive)를 얻은 다음 거기에서 Integer를 얻을 수 있습니다.

Integer i = new Integer(d.intValue());

2
new Integer(int)대신 Integer.valueOf(int)이 정수와 같은 작은 정수에 대한 캐시가있는을 사용 하지 마십시오 .
bvdb


4

"좁히기 또는 명시 적 유형 변환", 이중 → 긴 → int를 사용하여이를 수행 할 수 있습니다. 그것이 효과가 있기를 바랍니다.

double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l;    // Explicit type casting required

추신 : double에는 모든 소수점 값이 있고 왼쪽에는 아무것도 없으므로 0이됩니다. 0.58의 경우 0으로 좁힐 것입니다. 그러나 다른 사람들에게는 마술을 할 것입니다.


4

이거 한번 해봐

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();

3

Double 및 Integer는 각각 double 및 int에 대한 Java 프리미티브의 래퍼 클래스입니다. 그것들 사이에 캐스팅 할 수 있지만 부동 소수점을 잃게됩니다. 즉, int로 캐스팅 된 5.4는 5가됩니다. 다시 캐스팅하면 5.0이됩니다.


0

Double의 intValue 메소드를 사용하십시오.

Double initialValue = 7.12;
int finalValue = initialValue.intValue();

2
다른 답변의 반복처럼 보입니다.
Pang

0

doubleNumber.intValue();방법을 사용하십시오 .


2
다른 답변의 반복처럼 보입니다.
Pang

-1

이미 생성 된 Double 인스턴스를 공유하므로 메모리 효율적입니다.

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()

이유가 Math.floor(...)있습니까? intValue()어쨌든 항상 바닥.
bvdb

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.