java - 程序逻辑错误

标签 java floating-point

所以我目前正在阅读一本关于学习java的书,书中概述的一个程序给我带来了一些麻烦。具体来说,当我运行该程序来计算我应该从 9.87 开始获得的美元金额和零钱时,我会得到零钱,就好像我输入 9.86 一样。然而,当我输入 9.86 时,我得到了正确的找零金额。据我所知,这只发生在某些以 0.87 结尾的金额(例如 8.87)上,尽管它适用于 6.87 罚款。这是Java 编程简介第 8 版这本书,由于它是由专业人士编写的书,所以我对可能出现的错误感到困惑。我尝试在 cmd 和 eclipse 中运行它,两者似乎都显示错误。

PasteBin 链接:

http://pastebin.com/CVssSUYp

最佳答案

我几乎可以肯定,您对 float 的工作原理了解甚少。你不能用二进制精确地表示 0.1,就像你不能用十进制精确地表示 1/3 一样。除此之外,IEEE float 的 double 精度不能超过 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.
}

关于java - 程序逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10339949/

相关文章:

c++ - x86-64 长 double

c - 从 csv 读取,strtod 无法读取带有数字的字符串

c++ - 将值为 0.0f 的 float 转换为 boolean 值是否安全?

java - Datastax 驱动程序中 LOCAL_QUORUM 一致性级别的使用

java - <JSP>陷入错误 : "Unterminated &lt;c:forEach tag "

java - 将 Spring Batch 从 1.1.3 转换为 2.0.0

Java DecimalFormat,是否可以在小数部分进行分组?

java - WebApplicationInitializer 调用了两次

java - Spring MVC(RESTful API): Validating payload dependent on a path variable

javascript - UInt32、Int32、Float32的字节类型是什么?