0

現在、Java の学習に関する本を読んでいますが、本に記載されているプログラムで問題が発生しています。具体的には、プログラムを実行して 9.87 から得られるはずの金額と釣り銭を計算すると、9.86 と入力した場合と同じように釣り銭が得られます。ただし、9.86 と入力すると、正しい量の変更が得られます。私の知る限り、これは 8.87 などの .87 で終わる一部の金額でのみ発生しますが、6.87 では問題なく機能します。これはJava プログラミングの入門書第 8 版であり、専門家によって書かれた本だったので、エラーが何であるかについて混乱しています。cmd と eclipse で実行してみましたが、どちらも障害を示しているようです。

PasteBin リンク:

http://pastebin.com/CVssSUYp

4

3 に答える 3

5

浮動小数点数がどのように機能するかをよく理解していないことに悩まされていることはほぼ確実です。10 進数で 1/3 を表すことができないのと同じように、2 進数で 0.1 を正確に表すことはできません。さらに、IEEE 浮動小数点数は倍精度で 17 桁を超える精度を持つことはできません。

Java やコードのバグではありません。

お金は、10 進数で表してはならないものの典型的な例です。

整数のドルとセントを使用して Money クラスを作成し、十分な Java を学習したときにそれを使用します。

public class Money {
    private final int dollars;
    private final int cents;
    private final Currency currency;

    public Money(int dollars, int cents, Currency curr) {
        if (dollars < 0) throw new IllegalArgumentException("dollars cannot be negative");
        if (cents < 0) throw new IllegalArgumentException("cents cannot be negative");
        if (curr == null) throw new IllegalArgumentException("currency cannot be null");
        this.dollars = dollars; 
        this.cents = cents;
        this.currency = curr;
    }
    // more methods here.
}
于 2012-04-26T19:25:36.207 に答える
0

ダッフィーモ そうです。float の 9.87 x 100 は 986.999999999... になる可能性があり、整数にキャストバックすると 986 に変換されます。

(int) を使用して型キャストする前に、おそらく Math.round() を使用して、浮動小数点数を最も近い整数に丸めることができます。

import java.lang.Math;
...
int remainingAmount = (int)(Math.round(amount * 100));
...

正しい出力を生成します:

Your amount 9.87 consists of
        9 dollars
        3 quarters
        1 dimes
        0 nickels
        2 pennies

よろしく、

マニー

于 2012-04-26T19:38:21.737 に答える
0

amount を 9.87 に設定してから、100 を掛けてみてください。

double amount=9.87;
System.out.println(amount*100);

その後、同じものを印刷してみますが、int にキャストします。

double amount=9.87;
System.out.println((int)amount*100);

int へのキャストは、最後に小数を削除するだけであり (Hot Licks がコメントで述べたように)、浮動小数点数を正確に表すことができないため (duffymo が回答で述べたように)、予想どおり 987 ではなく 986 になります。 .

于 2012-04-26T19:44:31.977 に答える