MSM8994의 화룡점정 블로그

[JAVA] Math.round()를 활용하여 소수 N번째부터 반올림하기 본문

코딩

[JAVA] Math.round()를 활용하여 소수 N번째부터 반올림하기

msm8994 2018. 7. 16. 16:30

안녕하세요. Math.round(실수)가 소수점 첫째 자리에서 반올림해 가까운 정수를 내놓는다는 것은 알고 계실 겁니다.

5를 3으로 나누면 1.66666666666666666 .... 이 계산되어 나옵니다.
이 수를 1.667로 반올림하려면 어떻게 하면 될까요?

Math.round(result*1000)/1000.
매개변수에 10의 N제곱 만큼 곱해 소수점을 N번 뒤로 밀어 Math.round()로 반올림한 다음
그 결과를 10의 N제곱 만큼 나누어 소수점을 N번 앞으로 당기면 됩니다.

1.66666666666666 에 10의 3제곱 1000을 곱해서
1666.66666666666 로 만듭니다. 여기서 Math.round()를 실행시키면
1667 로 반올림된 정수가 반환됩니다. 이 결과를 10의 3제곱 1000으로 다시 나누면
1.667 이렇게 원하는 자릿수로 반올림된 결과를 얻을 수 있는겁니다.

※ 나눌 때 1000.으로 나누는 등 계산 도중 double 형 변환을 해야합니다.
그렇지 않을 때 1000으로 나누고나서 int 자료형의 한계로 소수점 아래가 모두 날아가 1만 남게 됩니다.

--------------------------------
기본적으로 C나 자바에서의 실수 표현은 2진수가 분모가 되는 수의 표현이 되기에 정확한 수를 구할 수 없을 수 있습니다.
예를 들면 0.625 는 625가 2진수가 되어 소수점이 이동하는게 아닌 0.5 + 0.125 즉 1/2와 1/8을 더한 수로 저장되는 식이죠. 
1을 3으로 나눈 값이 0.3333 ... 3335 로 마지막 자리가 3이 아니라 5가 떴던 것도 이 같은 방식의 오차 때문입니다.
계산에 오차가 생기는건 당연한 일인데 이를 머신 입실론이라고 부릅니다.



Comments