1

Javaでdouble値を丸めるために使用される次の関数があります。

public static double round(double d, int decimalPlace) {

    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
}

入力として、この関数は次の値を受け取ります。

double d = 7.3149999999999995;
int decimalPlace = 2

ただし、関数が戻ると、返される値は7.32ではなく7.31になります。ドキュメントを検索して、bd.SetScaleがその動作をしている理由を確認しましたが、成功しませんでした。

なぜこれが起こっているのか誰かに説明してもらえますか?どうもありがとう!!

4

2 に答える 2

11

なぜこれが起こっているのか誰かに説明してもらえますか?

文書化された動作に従います:)ドキュメントから:

操作によってスケールが縮小された場合、スケールされていない値を(乗算ではなく)除算する必要があり、値が変更される可能性があります。この場合、指定された丸めモードが除算に適用されます。

そしてのためにRoundingMode.HALF_UP

両方のネイバーが等距離にある場合を除き、「最も近いネイバー」に向かって丸める丸めモード。この場合、切り上げられます。

現在、7.3149999999999995は7.31と7.32の両方と等距離ではなく、7.31に近いため、結果になります。

HALF_UPとの違いはHALF_DOWN、元の値が正確に7.315である場合、つまり2つの中間である場合にのみ見られます。

余談ですが、最初に期待する数を正確Stringに取得するために、を使用することをお勧めします。例えば:

double d = 0.1;
BigDecimal bd = new BigDecimal(d);

と同じではありません:

BigDecimal bd = new BigDecimal("0.1");

doubleからへの変換BigDecimal通常、何か問題があることを示しているため、全体を通して1つのタイプを一貫して使用する必要があります。

于 2012-09-28T17:39:53.757 に答える
1

ROUND_HALF_UP:両方のネイバーが等距離にある場合を除き、「最も近いネイバー」に向かって丸める丸めモード。この場合、切り上げられます。

あなたの例では、7.314の4は10よりも0に近いため、最近傍は7.31です。これを証明するには、7.314...を7.315...に変更します。

さまざまな丸めモードを調べて、必要な動作を提供します。

于 2012-09-28T17:40:21.720 に答える