Java에서 Double을 정수로 캐스트
에 캐스팅 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
이렇게하면됩니다 ...
Double d = 13.5578;
int i = d.intValue();
System.out.println(i);
Double d = 100.00;
Integer i = d.intValue();
또한 오토 박싱과 함께 작동한다고 덧붙여 야합니다.
그렇지 않으면 int (primitive)를 얻은 다음 거기에서 Integer를 얻을 수 있습니다.
Integer i = new Integer(d.intValue());
물건을 부르 intValue()
십시오 Double
.
"좁히기 또는 명시 적 유형 변환", 이중 → 긴 → 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으로 좁힐 것입니다. 그러나 다른 사람들에게는 마술을 할 것입니다.
이걸로 해봐
double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();
Double 및 Integer는 각각 double 및 int에 대한 Java 프리미티브의 래퍼 클래스입니다. 그것들 사이에 캐스팅 할 수 있지만 부동 소수점을 잃게됩니다. 즉, int로 캐스팅 된 5.4는 5가됩니다. 다시 캐스팅하면 5.0이됩니다.
Double의 intValue 메소드를 사용하십시오.
Double initialValue = 7.12;
int finalValue = initialValue.intValue();
doubleNumber.intValue();
방법을 사용하십시오 .
이미 생성 된 Double 인스턴스를 공유하므로 메모리 효율적입니다.
Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()
그것은 나를 위해 일했다. 이 시도:
double od = Double.parseDouble("1.15");
int oi = (int) od;
참고 URL : https://stackoverflow.com/questions/9102318/cast-double-to-integer-in-java
'Programing' 카테고리의 다른 글
Windows의 localhost에서 현재 포트를 사용하는 프로세스를 종료하는 방법은 무엇입니까? (0) | 2020.03.04 |
---|---|
iOS의 NSDictionary에서 JSON 문자열 생성 (0) | 2020.03.04 |
Entity Framework를 사용하여 SQL Server 데이터베이스의 변경 사항을 저장하는 동안 하나 이상의 엔터티에 대한 유효성 검사에 실패했습니다 (0) | 2020.03.04 |
사용자가 IE를 사용하고 있는지 확인 (0) | 2020.03.04 |
JSON 객체를 typescript 클래스로 캐스트하는 방법 (0) | 2020.03.04 |