개발하다 보면 double 값을 int로 바꿔야 하는 경우가 있다.
처음에는 그냥 형변환하면 되는 줄 알았는데
소수점을 버릴지, 반올림할지에 따라 사용하는 방법이 달라진다.
간단하게 정리해봤다.
1. 캐스팅으로 double → int 변환
가장 간단한 방법은 (int)로 형변환하는 것이다.
double value = 10.8;
int result = (int) value;
System.out.println(result);
결과

(int)로 변환하면
소수점 아래 값은 그냥 버려진다.
즉,
10.8 → 10
10.1 → 10
10.9 → 10
처럼 처리된다.
반올림이 아니라는 점만 주의하면 된다.
2. Math.round()로 반올림하기
소수점을 반올림해서 int로 변환하고 싶다면
Math.round()를 사용할 수 있다.
double value = 10.8;
int result = (int) Math.round(value);
System.out.println(result);
결과

Math.round()는 소수점을 기준으로 반올림한다.
10.4 → 10
10.5 → 11
10.8 → 11
다만 double 값을 Math.round()에 넣으면 반환형은 long이기 때문에
최종적으로 int가 필요하다면 다시 캐스팅해줘야 한다.
int result = (int) Math.round(value);
3. Math.floor()로 내림하기
소수점을 내림 처리하고 싶다면 Math.floor()를 사용할 수 있다.
double value = 10.8;
double result = Math.floor(value);
System.out.println(result);
결과

Math.floor()는 결과를 double로 반환한다.
int로 사용하려면 아래처럼 변환하면 된다.
int result = (int) Math.floor(value);
결과
10
4. Math.ceil()로 올림하기
반대로 소수점이 있으면 올림하고 싶다면
Math.ceil()을 사용한다.
double value = 10.1;
int result = (int) Math.ceil(value);
System.out.println(result);
결과

한눈에 비교
10.8을 기준으로 보면 아래와 같다.
| 방법 | 결과 | 특징 |
| (int) value | 10 | 소수점 버림 |
| Math.round(value) | 11 | 반올림 |
| Math.floor(value) | 10 | 내림 |
| Math.ceil(value) | 11 | 올림 |
실제로 사용할 때
예를 들어 포인트 값이 double로 되어 있는데
저장할 값은 int라면 아래처럼 사용할 수 있다.
double rewardValue = 100.0;
int rewardPoint = (int) rewardValue;
소수점이 항상 필요 없는 값이라면
단순 캐스팅으로 처리해도 된다.
반대로
double rewardValue = 100.6;
처럼 소수점이 존재할 수 있고
반올림해서 저장해야 한다면
int rewardPoint = (int) Math.round(rewardValue);
처럼 처리하면 된다.
결국 중요한 건
double을 int로 바꿀 때 소수점을 어떻게 처리할지 먼저 정하는 것이다.
주의할 점
단순 캐스팅은 반올림이 아니다.
double value = 99.9;
int result = (int) value;
결과는
99
가 된다.
100이 필요하다면
(int) Math.round(value)
를 사용해야 한다.
그리고 값이 int 범위를 넘어갈 가능성이 있다면
단순 캐스팅 전에 값의 범위도 확인하는 게 좋다.
정리
double을 int로 변환하는 방법은 간단하다.
소수점을 그냥 버리고 싶다면
(int) value
반올림하고 싶다면
(int) Math.round(value)
내림은
(int) Math.floor(value)
올림은
(int) Math.ceil(value)
를 사용하면 된다.
'개발지식 > Java' 카테고리의 다른 글
| [자바/JAVA] 정적 바인딩 VS 동적 바인딩 (의의, 장/단점) (0) | 2023.09.05 |
|---|---|
| [자바/JAVA] 추상 클래스 VS 인터페이스 (특징, 사용하는 이유, 차이점) (0) | 2023.09.01 |
| [자바/JAVA] final 의미와 사용법 (0) | 2023.08.30 |
| [자바/JAVA] 변수의 선언 위치 (클래스 변수, 인스턴스 변수, 지역 변수) (0) | 2023.08.30 |
| [자바/JAVA] 오버로딩(Overloading) VS 오버라이딩(Overriding) (0) | 2023.08.29 |
