1. 概要

この短いチュートリアルでは、数値をJavaの小数点以下nに丸める方法を学習します。

2. Javaの10進数

Javaには、10進数の格納に使用できる2つのプリミティブタイプfloatdoubleが用意されています。 Doubleはデフォルトのタイプです。

double PI = 3.1415;

ただし、は、通貨などの正確な値にどちらのタイプも使用しないでください。 そのため、および丸めにも、BigDecimalクラスを使用できます。

3. 10進数のフォーマット

小数点以下n桁の10進数を出力するだけの場合は、出力文字列を単純にフォーマットできます。

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. DoubleBigDecimalで丸める

doubleを小数点以下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();
}

このソリューションで注意すべき重要なことが1つあります。 BigDecimal を作成するときは、常にBigDecimal(String)コンストラクターを使用する必要があります。 これにより、不正確な値を表す際の問題を防ぐことができます。

Apache Commons Math ライブラリを使用しても、同じ結果を得ることができます。

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

最新バージョンはここにあります。

ライブラリをプロジェクトに追加したら、 Precision.round()メソッドを使用できます。このメソッドは、値とスケールの2つの引数を取ります。

Precision.round(PI, 3);

デフォルトでは、ヘルパーメソッドと同じHALF_UP丸めメソッドを使用しています。 したがって、結果は同じである必要があります。

3番目のパラメーターとして目的の丸め方法を渡すことにより、丸め動作を変更できることに注意してください。

5. DoubleRounderで倍数を丸める

DoubleRounder は、decimal4jライブラリのユーティリティです。 これは、小数点以下0から18までのdoubleを丸めるための高速でガベージのない方法を提供します。

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()メソッド

数値を丸めるもう1つの方法は、 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にあります。