1. 개요

이 짧은 예제에서는 Java에서 소수점 이하 n 자리 로 숫자를 반올림하는 방법을 배웁니다 .

2. 자바의 10 진수

Java는 소수를 저장하는 데 사용할 수있는 두 가지 기본 유형 인 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 라이브러리를 사용하여 동일한 결과를 얻을 수 있습니다 .

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.5</version>
</dependency>

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

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

Precision.round(PI, 3);

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

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

5. 라운딩 복식 DoubleRounder

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

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

<dependency>
    <groupId>org.decimal4j</groupId>
    <artifactId>decimal4j</artifactId>
    <version>1.0.3</version>
</dependency>

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

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 에서 찾을 수 있습니다 .