現在、「double」変数を小数点以下 2 桁に丸めるプログラムを作成しようとしています。
私は方法を持っています:
DecimalFormat df = new DecimalFormat("#.00");
ただし、メソッドを適用すると:
double x = df.format(y-z);
「double」が予期されていたが、「string」が見つかったというエラーが表示されます。
これを修正する方法について何か提案はありますか?
ありがとう!
これを試して
@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を使用します
私の他の回答に対するコメントで、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 での同様の計算結果についてコメントしていただけますか。