[Java] 숫자 반올림/올림/내림
by항상 헷갈리는 반올림, 올림, 내림 RoundingMode를 정리해 보자.
// 단순하게 소수점 제거하고 프린트 하는 함수 - 화면 사이즈상 줄바꿈이나 띄워쓰기 제거
public void print(BigDecimal num) {
System.out.print(num.setScale(0, RoundingMode.UP));
System.out.print(num.setScale(0, RoundingMode.DOWN));
System.out.print(num.setScale(0, RoundingMode.CEILING));
System.out.print(num.setScale(0, RoundingMode.FLOOR));
System.out.print(num.setScale(0, RoundingMode.HALF_UP));
System.out.print(num.setScale(0, RoundingMode.HALF_DOWN));
}
print(BigDecimal.valueOf(5.5D));
print(BigDecimal.valueOf(1.6D));
print(BigDecimal.valueOf(1.1D));
print(BigDecimal.valueOf(-1.1D));
print(BigDecimal.valueOf(-1.6D));
print(BigDecimal.valueOf(-5.5D));
결과는?? 보통 양수는 안 헷갈린다. 음수를 보면.. 읭?!?!
| Input | UP | DOWN | CEILING | FLOOR | HALF_UP | HALF_DOWN |
|---|---|---|---|---|---|---|
| 5.5 | 6 | 5 | 6 | 5 | 6 | 5 |
| 1.6 | 2 | 1 | 2 | 1 | 2 | 2 |
| 1.1 | 2 | 1 | 2 | 1 | 1 | 1 |
| -1.1 | -2 | -1 | -1 | -2 | -1 | -1 |
| -1.6 | -2 | -1 | -1 | -2 | -2 | -2 |
| -5.5 | -6 | -5 | -5 | -6 | -6 | -5 |
학교에서 배우는 일반적인 반올림은 단어 그대로 HALF_UP이니 알기 쉽다. 그런데, 올림과 내림은?? FLOOR와 DOWN은 무슨 차이지?? CEILING과 UP은?? 자세히 보면 음수에서 차이가 난다. 5.5의 FLOOR와 DOWN은 모두 5로 같지만, -5.5는 FLOOR는 -6이고 DOWN은 -5이다. CEILING과 UP도 마찬가지이다.
간단히 그림으로 그려보면, 알기 쉽다. 가운데 빨간줄이 숫자 0이고, 오른쪽이 양수, 외쪽이 음수이다.
CEILING은 양수 방향으로 올림하고,FLOOR는 음수 방향으로 내림한다.UP은0에서 멀어지는 방향으로 올림하고,DOWN은0에 가까워지는 방향으로 내림한다.HALF_UP과HALF_DOWN은 이름에서 알 수 있듯이UP과DOWN과 같은 방향이다.
deprecated RoundingMode
BigDecimal에서 RoundingMode를 줄 때 쓰던 BigDecimal.ROUND_XXX는 jdk9부터 deprecated되었다. RoundingMode.XXX를 사용하자. (RoundingMode)
