2
String phrase = "4556.44";
Float num = new Float(phrase);
int dollars = (int) Math.floor(num);
System.out.println(""+dollars);
int cent = (int) Math.floor((num - dollars) * 100.0F);
int cent2 =  (int) ((num - dollars) * 100.0);
System.out.println(""+cent+":"+cent2);

これは Number to Word クラスのコード フレーズです。私の問題は、このコード フラグメントを実行すると、出力結果が4556.43. しかし、入力値は4556.44. この問題が発生した理由を教えてください。この問題を解決するための答えが必要です。

4

6 に答える 6

2

制御された丸めを使用した高精度の計算では、BigDecimal代わりに使用しますFloat

于 2012-07-28T10:09:06.570 に答える
1

float は double よりも精度が低く、bigDecimal よりも精度が低くなります。

絶対に正確でなければならないプログラム (金融アプリケーションなど) で作業する場合は、BigDecimal を使用します。

これが小さな宿題で重要でないアプリである場合は、Double を試して、十分に正確かどうかを確認できます。

于 2012-07-28T10:16:02.713 に答える
0
int cent = (int)(num * 100f % 100f);
于 2012-07-28T10:17:56.173 に答える
0

Float精度の高い計算には適していません。

 int cent = (int) Math.floor((num - dollars) * 100.0F);

コード内の上記のステートメントは、期待どおりに正確な答えを提供するわけではありません。

DoubleまたはBigInteger可能であれば使用してみてください。

于 2012-07-28T10:18:23.163 に答える
0

FloatsとDoublesは、1、1 / 2、1 / 4、1 / 8、1 / 16などのいずれかの数値を加算して数値を構成する仕様を使用しているため、すべての可能な実数を表すことはできません。

試してみると0.1f+0.1f+0.1f==0.3f、間違いになります。したがって、他の人が言ったように、BigDecimalを使用します。これは別の表現を使用し、はるかに低速ですが、これらの問題は発生しません。

于 2012-07-28T10:18:53.870 に答える
0

次のこともできます

String phrase = "4556.44";
long money = Math.round(Double.parseDouble(phrase) * 100);
long dollars = money / 100;
long cents = money % 100;
System.out.printf("%,d dollars and %d cents%n", dollars, cents);

プリント

4,556 dollars and 44 cents
于 2012-07-28T10:28:13.767 に答える