Java에서 숫자를 N 소수 자릿수로 반올림하는 방법

1. 개요

이 짧은 기사에서는 Java에서 소수점 이하 n 자리 로 숫자를 반올림하는 방법을 살펴 보겠습니다 .

2. 자바의 10 진수

Java는 10 진수 저장에 사용할 수있는 두 가지 기본 유형 인 floatdouble을 제공 합니다. Double 은 기본적으로 사용되는 유형입니다.

double PI = 3.1415;

그러나 두 유형 모두 통화와 같은 정확한 값에 사용해서는 안됩니다 . 이를 위해, 또한 반올림을 위해 BigDecimal 클래스를 사용할 수 있습니다 .

3. 10 진수 서식 지정

소수점 뒤에 n 자리가 있는 십진수를 인쇄 하려면 출력 문자열의 형식을 지정하면됩니다.

System.out.printf("Value with 3 digits after decimal point %.3f %n", PI); // OUTPUTS: Value with 3 digits after decimal point 3.142

또는 DecimalFormat 클래스를 사용하여 값을 형식화 할 수 있습니다 .

DecimalFormat df = new DecimalFormat("###.###"); System.out.println(df.format(PI));

DecimalFormat을 사용하면 반올림 동작을 명시 적으로 설정하여 위에서 사용 된 String.format () 보다 출력을 더 많이 제어 할 수 있습니다 .

4. BigDecimal로 Double s 반올림

double s를 소수 n 자리로 반올림하려면 도우미 메서드를 작성할 수 있습니다 .

private static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); BigDecimal bd = new BigDecimal(Double.toString(value)); bd = bd.setScale(places, RoundingMode.HALF_UP); return bd.doubleValue(); }

이 솔루션에서 주목해야 할 중요한 사항이 있습니다 . BigDecimal을 생성 할 때입니다 . 항상 BigDecimal (String) constructor를 사용해야 합니다 . 이것은 부정확 한 값을 나타내는 문제를 방지합니다.

Apache Commons Math 라이브러리를 사용하여 동일한 결과를 얻을 수 있습니다.

 org.apache.commons commons-math3 3.5 

최신 버전은 여기에서 찾을 수 있습니다.

라이브러리가 프로젝트에 추가되면 Precision.round () 메서드를 사용할 수 있습니다.이 메서드는 값과 크기의 두 인수를받습니다.

Precision.round(PI, 3);

기본적으로 도우미 메서드 와 동일한 HALF_UP 반올림 방법을 사용합니다 . 따라서 결과는 동일해야합니다.

원하는 반올림 방법을 세 번째 매개 변수로 전달하여 반올림 동작을 변경할 수 있습니다.

5. 라운딩 복식 DoubleRounder

DoubleRounder는 decimal4j 라이브러리의 유틸리티입니다. 소수점 0에서 18까지 두 배를 반올림하는 빠르고 가비지없는 방법을 제공합니다.

pom.xml에 종속성을 추가하여 라이브러리 (최신 버전은 여기에서 찾을 수 있음)를 얻을 수 있습니다 .

 org.decimal4j decimal4j 1.0.3 

이제 다음을 간단히 사용할 수 있습니다.

DoubleRounder.round(PI, 3);

그러나 DoubleRounder 는 다음과 같은 몇 가지 시나리오에서 실패합니다.

System.out.println(DoubleRounder.round(256.025d, 2)); // OUTPUTS: 256.02 instead of expected 256.03

6. Math.round () 메서드

숫자를 반올림하는 또 다른 방법은 Math.Round () 메서드를 사용하는 것입니다.

이 경우 10 ^ n 을 곱하고 나눔으로써 n 개의 소수 자릿수를 제어 할 수 있습니다 .

public static double roundAvoid(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }

이 방법은 값을 자르기 때문에 권장되지 않습니다 . 대부분의 경우 값이 잘못 반올림됩니다.

System.out.println(roundAvoid(1000.0d, 17)); // OUTPUTS: 92.23372036854776 !! System.out.println(roundAvoid(260.775d, 2)); // OUTPUTS: 260.77 instead of expected 260.78

따라서이 방법은 학습 목적으로 만 여기에 나열되어 있습니다.

7. 결론

이 빠른 자습서에서는 숫자를 소수점 이하 n 자리로 반올림하는 다양한 기술을 다뤘 습니다.

값을 변경하지 않고 출력 형식을 지정하거나 도우미 메서드를 사용하여 변수를 반올림 할 수 있습니다. 또한이 문제를 다루는 몇 가지 라이브러리를 다루었습니다.

토론 중에 사용 된 코드는 GitHub에서 찾을 수 있습니다.