반올림 [半-, rounding to the nearest whole number]
사사오입(四捨五入)이라고도 한다. 구하는 자리보다 한 자리 아래의 숫자가 5보다 작을 때에는
버리고, 5와 같거나 5보다 클 때에는 올리는 방법을 가리킨다. 이를테면, 84,386의 천의 자리까
지의 근사값을 구하면, 84,000 이다. [펌:네이버]
위 내용을 간략히 줄인다면
1~4 는 버림을 하며 5~9는 올람
일 것입니다.
그 전에 한 경우를 생각해 보기로 하겠습니다.(예입니다)
제가 구멍가게 주인이지요.
여러분은 손님입니다.
제가 가지고 있는 상품들의 판매 가격들을 본다면
xx3원, xx1원, xx4원, xx5원, xx7원.......
이런 식으로 가격이 정해져 있습니다.
일원자리가 없는 관계로 전 일의 자리에서 반올림해서 팔리고 한 것입니다.
위 내용을 보신다면 여지껏 별 생각없이 그럴니 하구 지내셨을꺼라 생각합니다.
전 여기서 집히는 것이 있어서 그냥 넘어가기 싫었거든요..
(진짜냐구 물으신다면 안되죠... 전 그런 천재가 아니니깐요.ㅋㅋ)
반올림은
위에서 정의 한 것처럼
반올림 자리수가 1~4라면 버리구
5~9라면 올린다는 건 누구나가 알고 있습니다.
1~4 를 버리면
버린 걸 6~9 에서 얻어가므로
전 공평하다고 생각합니다.
그렇지만
전 5원이면 무조건 올리니깐
5원으로 떨어지는 걸 중심으로 팔아서 좀 더 이익을 볼 수가 있었습니다.
5에선 무조건 올리구 제가 깎아야 할 것이 없으니깐 좋았죠..
아 근데 어떤 손님이 제가 생각한 걸 아시고는 따지는 겁니다.
몇 원 가지고요.. 헉~ 어떤 손님은 소송까지 걸려구 하던데요.
손님의 반발이 하두 거세서
좀 공평한 방법이 있어야 한다구 생각한거지요.
어떤 것이 있을까 하다가 생각해 낸 것이 있습니다.
일의 자리가 5원이라면 그 앞자리를 생각하구 올림을 결정하기로 한거죠.
5의 앞자리가 홀수면 5의 자리를 올리고 짝수라면 버리는 거죠
235원이라면 올리므로 240원에 팔구 285원이면 버리므로 280원에 팝니다.
(제가 이런 법칙을 만들었다면...여기 없죠, 혹 sun에 있을지...ㅋㅋ)
이렇게 바꾸고 나니깐 아 손님들이 안 따지더라구요.
자바에서 어떻게 되는지 설명을 드리겠습니다.
(자바 공부하면서 알게 된 걸 위 예를 억지로 만든거에요 ㅋㅋ)
위와 같이 반올림에 대해서는
IEEE 754 표준안에 정해져 있다고 합니다.
그래서 자바에서는
반올림 메서드가 2개가 있습니다.
round(), rint()
이 메소드의 사용된 소스를 보시겠습니다.
public class Ex_3 {
public static void main(String args[]) {
System.out.println("rint(1.5) = " + Math.rint(1.5));
System.out.println("rint(1.499999) = " + Math.rint(1.499999));
System.out.println("round(1.5) = " + Math.round(1.5));
System.out.println("round(1.499999) = " + Math.round(1.499999));
}
}
위 소스는 네이버에서 검색을 하다 찾게 된 소스입니다.
위 소스를 실행한다면 차이점을 찾기 힘듭니다.
(전 하나는 실수고 또 다른 하나는 정수구나라구 생각을 했습니다.)
그렇다면
다음과 같이 수정해 주시고 실행해 보시기 바랍니다.
public class Ex_3 {
public static void main(String args[]) {
System.out.println("rint(2.5) = " + Math.rint(2.5));
System.out.println("rint(1.5) = " + Math.rint(1.5));
System.out.println("round(2.5) = " + Math.round(2.5));
System.out.println("round(1.5) = " + Math.round(1.5));
}
}
2개의 소스를 직접 실행해 보시기 바랍니다.
개념을 전혀 모르고 이를 실행할 경우 똑같은 반올림인데
왜 결과가 다르지 하시는 분이 있을꺼라 생각합니다.
하지만
제가 위에서 설명한 내용을 생각하신다면
아~~
하실 것이라 생각합니다.
한 가지 더 예를 들어 보겠습니다.
두 회사 간에 제품 거래에 있어서
손익 계산이 확률로 표현되어질 때를 생각한다구 가정한다면
소수 둘째짜리까지 표현할 경우입니다. 셋째짜리에선 반올림을 하는거죠.
여기서 반올림이 기존 방식대로 그냥 진행되어 진다구 생각을 할 때
1%가 1억의 단위라면
어느 한쪽은 0.005의 손실이 계속 누적 된다고 생각할 경우 어떠할까요?
제 생각이지만 이런 경우 때문에 표준안이 정해지지 않았나 생각합니다.
최종 정리입니다.
round()는 기존 반올림으로
1~4는 버리며 5~9는 올립니다.
rint() 는 표준안이 정해진 것이므로
반올림 자리 앞자리의 경우를 생각해서
그 자리가 홀수라면 기존 반올림을 적용하며
짝수일 때는 버림을 가집니다.
정해진 수를 짝수로 만드는 방법입니다.
한가지 더 있습니다.
VB는 실수값이 정수형 변수에 기억될 때 IEEE 754 표준안에 따라 반올림이 적용 된다구