1

現在、「double」変数を小数点以下 2 桁に丸めるプログラムを作成しようとしています。

私は方法を持っています:

DecimalFormat df = new DecimalFormat("#.00");

ただし、メソッドを適用すると:

double x = df.format(y-z);

「double」が予期されていたが、「string」が見つかったというエラーが表示されます。

これを修正する方法について何か提案はありますか?

ありがとう!

4

3 に答える 3

1

これを試して

@Test
public void test() {
    int f = 100;

    double d = 123.456;
    double temp = d * f;
    double rounded = Math.round(temp);
    double to2dp = rounded / f;

    Assert.assertEquals(123.46, to2dp, 0.00001);
}      

f = 100 は 2 dp です。1dpなどにはf = 10を使用します

于 2012-09-30T13:07:24.773 に答える
0

double を使用して通貨の値を保存/計算している場合、丸めの世界で苦労する可能性があります。そこにいた、それをした、傷がついた。

すべてBigDecimalの通貨値に値を使用し、インスタンス化に double を含めないことを強くお勧めします。常にコンストラクターを使用します。String

関連する質問はこちらこちらをご覧ください。

于 2012-11-26T20:24:55.093 に答える
0

私の他の回答に対するコメントで、Gary Rowe は Joda Money を解決策として使用することを提案しました。

これは素晴らしい製品かもしれませんが、試したことがないことを認めなければなりませんが、ドキュメントの次の例について少し心配しています。

// multiplies by 3.5 with rounding
money = money.multipliedBy(3.5d, RoundingMode.DOWN);

これは、倍精度を使用して正確に表現できる double 量を使用したため、興味深い例です。

これを説明するために、次の単体テストを例に取りましょう。

    double d1 = 3.5d;
    BigDecimal bd1 = new BigDecimal(d1);
    System.out.println("BD version of " + d1 + " = " + bd1);

    BigDecimal bd2 = new BigDecimal("10000000");
    BigDecimal bd3 = bd2.multiply(bd1);

    System.out.println("Result in bd3 = " + bd3);

これにより、次の出力が得られます。

BD version of 3.5 = 3.5
Result in bd3 = 35000000.0

ただし、「3.5d」を「3.4d」に変更すると、非常に異なる結果が得られます。

BD version of 3.4 = 3.399999999999999911182158029987476766109466552734375
Result in bd3 = 33999999.999999999111821580299874767661094665527343750000000

現在、Joda Money クラスはこれを (何らかの方法で) 処理することができますが、倍精度数をミックスに導入することは危険を伴います。

Gary さん、Joda Money での同様の計算結果についてコメントしていただけますか。

于 2013-02-25T01:30:29.823 に答える