Notice
Recent Posts
Recent Comments
Link
MSM8994의 화룡점정 블로그
[JAVA] Math.round()를 활용하여 소수 N번째부터 반올림하기 본문
안녕하세요. 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가 떴던 것도 이 같은 방식의 오차 때문입니다.
'코딩' 카테고리의 다른 글
[JAVA] 역방향으로 별 수를 줄여갈 때 같은코드가 두 번 작성되지 않는 별찍기1 (2) | 2018.07.17 |
---|---|
[JAVA] 다단 구구단 만들기 (0) | 2018.07.17 |
[JAVA] 1부터 10까지 합과 홀수 합과 짝수 합 식까지 표시하기 (0) | 2018.07.16 |
≠ 이 글자 어떻게 입력하지? (2) | 2018.07.13 |
Java 자료형 범위 초과시 자료가 저장되는 방식 (1) | 2018.07.12 |
Comments