프로그래밍 언어/JAVA

Java에서 소수점 이하 n 자리로 숫자를 반올림하는 방법

Rateye 2021. 12. 7. 10:09
728x90
반응형
질문 : Java에서 소수점 이하 n 자리로 숫자를 반올림하는 방법

내가 원하는 것은 half-up 방법을 사용하여 반올림하는 문자열로 double을 변환하는 방법입니다. 즉, 반올림 할 소수점이 5이면 항상 다음 숫자로 반올림됩니다. 이것은 대부분의 상황에서 대부분의 사람들이 기대하는 반올림의 표준 방법입니다.

또한 유효 숫자 만 표시하고 싶습니다. 즉, 뒤에 0이 없어야합니다.

이 작업을 수행하는 한 가지 방법은 String.format 메서드를 사용하는 것입니다.

String.format("%.5g%n", 0.912385);

보고:

0.91239

훌륭하지만 중요하지 않더라도 항상 소수점 이하 5 자리로 숫자를 표시합니다.

String.format("%.5g%n", 0.912300);

보고:

0.91230

DecimalFormatter 를 사용하는 것입니다.

DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);

보고:

0.91238

그러나 보시다시피 반올림을 사용합니다. 즉, 이전 숫자가 짝수이면 내림됩니다. 내가 원하는 것은 다음과 같습니다.

0.912385 -> 0.91239
0.912300 -> 0.9123

Java에서 이것을 달성하는 가장 좋은 방법은 무엇입니까?

답변

setRoundingMode 를 사용하고 RoundingMode 명시 적으로 설정하여 반짝 수 라운드 문제를 처리 한 다음 필요한 출력에 형식 패턴을 사용합니다.

예:

DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
    Double d = n.doubleValue();
    System.out.println(df.format(d));
}

출력을 제공합니다.

12
123.1235
0.23
0.1
2341234.2125

편집 : 원래 대답은 이중 값의 정확성을 다루지 않습니다. 반올림하든 내림하든별로 신경 쓰지 않으면 괜찮습니다. 그러나 정확한 반올림을 원하면 값의 예상 정확도를 고려해야합니다. 부동 소수점 값은 내부적으로 이진 표현을 사용합니다. 이는 2.7735와 같은 값이 실제로 내부적으로 정확한 값을 가지고 있지 않음을 의미합니다. 약간 더 크거나 약간 작을 수 있습니다. 내부 값이 약간 더 작 으면 2.7740으로 반올림되지 않습니다. 이러한 상황을 해결하려면 작업중인 값의 정확성을 인식하고 반올림하기 전에 해당 값을 더하거나 빼야합니다. 예를 들어 값이 최대 6 자리까지 정확하다는 것을 알고있는 경우 값을 반올림하려면 해당 정확도를 값에 추가합니다.

Double d = n.doubleValue() + 1e-6;

반올림하려면 정확도를 뺍니다.

출처 : https://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in-java
728x90
반응형