2

重複の可能性:
通貨を表すために Double または Float を使用しないのはなぜですか?

私は Java を学んでいるので、このような単純な質問にご容赦ください。利息を計算する計算が与えられたとき、私はこのコードを入力しました:

 public double calculateTotal(double rate, int n)
 {
     amount = amount * Math.pow((1+rate), (n/12));
     return amount;
 }

これは私が探している答えを返しますが、最後に 0.000000000001 を追加し続けます。どうすればこれを解決できますか? 友人が数値の書式設定と呼ばれるものをアドバイスしましたが、解決策が見つかりませんでした。

4

2 に答える 2

1

この問題は、広く知られている浮動小数点計算の問題に関連しています。

解決策の1つは、import java.math.BigDecimal

編集

Java では演算子のオーバーライドが許可されていないため、s を一緒に追加する唯一の方法はBigDecimaladdメソッドを使用することですBigDecimalcalculateTotalammount

// you assign result to amount outside calculateTotal
amount.add(new BigDecimal(Math.pow((1+rate), (n/12))));

また

// you assign sum to amount inside calculateTotal
amount = amount.add(new BigDecimal(Math.pow((1+rate), (n/12))));
于 2013-01-11T17:34:21.997 に答える
1

前に述べたようにBigDecimal、倍精度でより良い精度が必要な場合は良いオプションです。

sで丸めを行う良い方法がありますBigDecimal。基本的にBigDecimalインスタンスのスケールを指定する必要があります。このサンプル コードを見てください。

BigDecimal decimalOne = new BigDecimal(0.1950);
BigDecimal decimalTwo = decimalOne.setScale(2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal decimalThree = decimalOne.setScale(4, BigDecimal.ROUND_HALF_DOWN);

System.out.println("decimalOne: " + decimalOne);
System.out.println("decimalTwo: " + decimalTwo);
System.out.println("decimalThree: " + decimalThree);

Java 7 は次のように出力します。

decimalOne: 0.195000000000000006661338147750939242541790008544921875
decimalTwo: 0.20
decimalThree: 0.1950

BigDecimalインスタンスは不変であるため、結果setScaleを新しいインスタンスに割り当てる必要があることに注意してください(decimalOne変更されません)。


多くの金融システムdoubleでは、 は通貨情報の格納には使用されません。代わりに、特定の精度の型が使用されます。longたとえば、精度 2 の場合、値1001.00、ただし、その質問を簡単にするために、私はその主題にあまり深く入り込みません。1221.22

于 2013-01-12T11:56:01.090 に答える