에 캐스팅 java.lang.Double
하는 방법 java.lang.Integer
?
예외가 발생합니다
“java.lang.ClassCastException : java.lang.Double과 호환되지 않는 java.lang.Integer”
답변
A Double
는 님이 아니므로 Integer
캐스트가 작동하지 않습니다. Double
클래스 와 double
프리미티브 의 차이점에 유의하십시오 . 또한이 점에 유의 Double
A는 Number
, 그 방법이있다, 그래서 intValue
당신이 프리미티브 값을 얻기 위해 사용할 수 있습니다 int
.
답변
다음과 같이 intValue () 메소드를 사용하여 명시 적으로 int 값을 가져와야합니다.
Double d = 5.25;
Integer i = d.intValue(); // i becomes 5
또는
double d = 5.25;
int i = (int) d;
답변
함정과 추론을 다루지 않고 다른 답변을 이해하는 것은 불가능하다고 생각합니다. 뒤에 합니다.
당신은 직접 캐스팅 할 수없는 Integer
A와 Double
객체입니다. 또한 Double
및Integer
당신이 어떤 방식으로 수정할 수 있도록, 불변의 객체입니다.
각 숫자 클래스 에는 기본 대안이 있습니다 ( Double
vs double
, Integer
vs int
, …). 이 기본 요소는 소문자 (예 :)로 시작 int
합니다. 그것은 그들이 클래스 / 객체가 아니라는 것을 알려줍니다. 또한 메소드가 없다는 것을 의미합니다. 반대로 클래스 (예 Integer
:)는 이러한 기본 요소 주위의 상자 / 래퍼처럼 작동하므로 객체처럼 사용할 수 있습니다.
전략:
를 변환하려면 Double
에 Integer
이 전략을 수행해야합니다 :
Double
객체를 프리미티브로 변환합니다double
. (= “unboxing”)- 프리미티브
double
를 프리미티브 로 변환합니다int
. (= “캐스팅”) - 기본 요소를
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) = 1
및 round(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
답변
세 가지 가능성이 있습니다. 처음 두 자리는 숫자를 잘라 내고, 마지막 두 자리는 가장 가까운 정수로 반올림합니다.
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
답변
이처럼 :
Double foo = 123.456;
Integer bar = foo.intValue();
답변
실제로 가장 간단한 방법은을 사용하는 것 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과 같은 이상한 오리 사례를 상대적인 은혜로 처리합니다.
답변
double a = 13.34;
int b = (int) a;
System.out.println(b); //prints 13