Double値を小数点以下2桁に丸めようとしていますが、すべてのシナリオで機能しません
public static double round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.doubleValue();
}
public static void main(String[] args) {
System.out.println(round(25.0,2)); //25.0 - expected 25.00
System.out.println(round(25.00d,2)); //25.0 - expected 25.00
System.out.println(round(25,2)); //25.0 - expected 25.00
System.out.println(round(25.666,2)); //25.67
}
つまり、10進数が存在するかどうかに関係なく、追加のゼロを埋め込む必要がある場合でも、常に2桁までの値を保持します。
どんな助けも大歓迎です!
コードで改善できるものが2つあります。
まず、BigDecimalにdoubleをキャストして丸めることは、非常に非効率的なアプローチです。代わりにMath.roundを使用する必要があります。
double value = 1.125879D;
double valueRounded = Math.round(value * 100D) / 100D;
第二に、実数を文字列に印刷または変換する場合、System.out.printfまたはString.formatの使用を検討できます。あなたの場合、フォーマット "%.2f"を使用することでうまくいきます。
System.out.printf("%.2f", valueRounded);
Stringクラスのformat()関数を使用します。より簡単なコード。 「%.2f」の2は、表示する小数点以下の桁数を示します。 「%.2f」のfは、浮動小数点数を印刷していることを示します。文字列のフォーマットに関するドキュメントを次に示します( http://docs.Oracle.com/javase/7/docs/api/Java/util/Formatter.html#syntax )
double number = 12.34567;
System.out.println(String.format("%.2f", number));
これはあなたのために働くでしょう:
public static void main(String[] args) {
DecimalFormat two = new DecimalFormat("0.00"); //Make new decimal format
System.out.println(two.format(25.0));
System.out.println(two.format(25.00d));
System.out.println(two.format(25));
System.out.println(two.format(25.666));
}
BigDecimal
をdouble
に変換し直します。これにより、基本的に末尾のゼロが削除されます。
BigDecimal
またはBigDecimal.toPlainString()
のいずれかを返すことができます。
public static String round(double value, int places) {
if (places < 0) throw new IllegalArgumentException();
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(places, RoundingMode.HALF_UP);
return bd.toPlainString();
}