Javaで数値をN桁に丸める方法
1. 概要
この短い記事では、Javaで数値を小数点以下nに丸める方法を見ていきます。
参考文献:
2. Javaの10進数
Javaには、10進数の格納に使用できる2つのプリミティブ型(floatとdouble)が用意されています。 Doubleは、デフォルトで使用されるタイプです。
double PI = 3.1415;
ただし、通貨など、どちらのタイプもshould never be used for precise valuesです。 そのために、また丸めのために、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. DoublesをBigDecimalで丸める
doublesを小数点以下nに丸めるには、helper methodと書くことができます。
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を作成するときです。 always use BigDecimal(String) constructorする必要があります。 これにより、不正確な値の表現に関する問題が防止されます。
Apache Commons Mathライブラリを使用して同じことを実現できます。
org.apache.commons
commons-math3
3.5
最新バージョンはhereで見つけることができます。
ライブラリがプロジェクトに追加されると、Precision.round()メソッドを使用できます。このメソッドは、値とスケールの2つの引数を取ります。
Precision.round(PI, 3);
デフォルトでは、ヘルパーメソッドと同じHALF_UP丸めメソッドを使用しています。 したがって、結果は同じになるはずです。
必要な丸め方法を3番目のパラメーターとして渡すことで、丸めの動作を変更できることに注意してください。
5. DoubleRounderで倍数を丸める
DoubleRounderは、decimal4jライブラリのユーティリティです。 0から18小数点までの倍数を丸めるための高速でゴミのない方法を提供します。
pom.xmlに依存関係を追加することで、ライブラリ(最新バージョンはhereにあります)を取得できます。
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() Method
数値を丸める別の方法は、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;
}
This method is not recommended as it’s truncating the value。 多くの場合、値は誤って丸められます。
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に丸めるためのさまざまな手法について説明しました。
値を変更せずに出力をフォーマットするか、ヘルパーメソッドを使用して変数を丸めることができます。 また、この問題を処理するいくつかのライブラリについても説明しました。
議論中に使用されたコードはover on GitHubで見つけることができます。