[java] Java에서 Double을 정수로 캐스트

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

예외가 발생합니다

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



답변

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


답변

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

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

또는

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


답변

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

당신은 직접 캐스팅 할 수없는 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


답변

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

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