0

所以我目前正在阅读一本关于学习 Java 的书,书中概述的一个程序给我带来了一些麻烦。特别是当我运行程序来计算我应该从 9.87 获得的美元数量和零钱时,我得到的零钱就像我输入 9.86 一样。但是,当我输入 9.86 时,我得到了正确的变化量。据我所知,这只发生在某些以 0.87 结尾的金额,例如 8.87,尽管它适用于 6.87 罚款。这是第 8 版 Java 编程简介的书,由于它是由专业人士撰写的书,我对错误可能是什么感到困惑。我试过在 cmd 和 eclipse 中运行它,似乎都显示了错误。

PasteBin 链接:

http://pastebin.com/CVssSUYp

4

3 回答 3

5

我几乎可以肯定你被对浮点数如何工作的理解不足所困扰。你不能再用二进制精确表示 0.1,就像用十进制表示 1/3 一样。然后,除此之外,IEEE 浮点数的双精度数不能超过 17 位。

这不是 Java 或您的代码中的错误。

金钱是不应该用十进制数字表示的东西的典型例子。

编写一个包含整数美元和美分的 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

达菲莫是对的。浮点数中的 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

尝试将数量设置为 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 在答案中所说)你最终得到 986 而不是 987 正如你所期望的.

于 2012-04-26T19:44:31.977 回答