web-dev-qa-db-ja.com

Java Doubleは常に2桁の10進数に丸めます

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桁までの値を保持します。

どんな助けも大歓迎です!

13
Reddy

コードで改善できるものが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);
17
Aivean

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));
5
DucRP

これはあなたのために働くでしょう:

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));

}
5

BigDecimaldoubleに変換し直します。これにより、基本的に末尾のゼロが削除されます。

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();
}
3
RP-