間違ったJavaの小数点、したがって間違った計算

私が得た出力は次のようなものです:

number of bags ordered : 43 ($236.50)

discount : 5% ($11.83)

total cost : $224.68

that correct total cost should be 224.67 because 236.50 - 11.83 = 224.67

the discount I got using %.2f shows 11.83 where the original value is 11.825

total cost = bags ordered - discount

224.68 != 236.50 - 11.825 = 224.675

私は値を切り上げているので、 224.68 ではなく 224.67 としたいからです。

それが236.50-11.83 = 224.67だが236.50-11.825 = 224.675でないことを確実にする方法?

someone please help me with this ><

ありがとうございました :)

0
コードを表示してください。
追加された 著者 Michael Petrotta,
.2fは、正確ではない浮動小数点演算を示唆しています。
追加された 著者 Scorpion,

4 答え

通貨計算に浮動小数点数を使用しないでください。 10進数のクラス

3
追加された
現在、私のレッスンの避難所はBigDecimalまでカバーしています。私は私のコーディングDでそれを使用することを考えていない:他のアイデア?
追加された 著者 Pei Pei,

BigDecimal クラスに切り替えることを検討してください。 setScale(int newScale、RoundingMode roundingMode)関数は、小数点以下の桁を完全に制御することができます。

1
追加された
チャンスは誰も BigDecimal でクラスを教えてくれる人はいないということです。リンク上のページに行くか、Googleだけであれば、それに関する多くの情報や例が見つかります。
追加された 著者 Gevorg,
現在、私のレッスンの避難所はBigDecimalまでカバーしています。私は私のコーディングDでそれを使用することを考えていない:他のアイデア?
追加された 著者 Pei Pei,

浮動小数点演算は、1桁のような固定小数点の場合は通貨で悪いです。整数を使用して出力をフォーマットし、2桁の数字をで区切っておくと、多くの頭痛を軽減できます。

浮動小数点を維持したい場合は、丸めと掛け算/除算を使用して、実際に印刷によって同じ丸めを行うようなトリックを行う必要があります(例:

  • 11.825 * 100 = 1182.5
  • 数学(1182.5)= 1183
  • 1183/100 = 11.83
0
追加された
私は2番目のものを使用してそれを作ることができます:Dしかしmath.round()は私のシラバスにまだありません=。= BigDecimalを行います。だから私はそれをやる方法を知らない...
追加された 著者 Pei Pei,

他のライブラリクラスを使用する必要がないので、引き続き独自の丸めメソッドを実装できます。

public static float round(float val) {
   return (val*100.0 + 0.5)/100.0;
}

後続の操作で値を使用する前に値を丸めます。

0
追加された
しかし、それは正確ではありません。浮動小数点値は実際に小数点以下の桁数を持たないので、小数点以下の桁数に丸めたり切り捨てたりするのがキメラです。
追加された 著者 EJP,