[Java] 숫자 반올림/올림/내림

by 스뎅(thDeng) on

항상 헷갈리는 반올림, 올림, 내림 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이니 알기 쉽다. 그런데, 올림과 내림은?? FLOORDOWN은 무슨 차이지?? CEILINGUP은?? 자세히 보면 음수에서 차이가 난다. 5.5FLOORDOWN은 모두 5로 같지만, -5.5FLOOR-6이고 DOWN-5이다. CEILINGUP도 마찬가지이다.

간단히 그림으로 그려보면, 알기 쉽다. 가운데 빨간줄이 숫자 0이고, 오른쪽이 양수, 외쪽이 음수이다.

Rounding behavior

deprecated RoundingMode

BigDecimal에서 RoundingMode를 줄 때 쓰던 BigDecimal.ROUND_XXX는 jdk9부터 deprecated되었다. RoundingMode.XXX를 사용하자. (RoundingMode)

Deprecated rounding mode

참고

별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License