关于java:Double减去int给出意想不到的结果

Double minus int giving unexpected results

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Floating point arithmetic not producing exact results in Java
Floating point inaccuracy examples

在Java中,给出以下代码:

1
2
3
4
5
6
7
    double amount = scan.nextDouble();

    tenBills = (int)amount / (int)10;
    amount = amount - (tenBills * 10);

    fiveBills = (int)amount / (int)5;
    amount = amount - (fiveBills * 5);

在第一次计算之后,如果输入16个数量,则等于6.66。但第二次计算后的金额将为166000000000001。我不明白为什么从double中减去int会产生这样的结果。


如果你想要一个核心的解释,读一读每一个计算机科学家应该知道的关于浮点运算的经典著作。它解释了为什么在浮点运算中不可避免地会有微小的舍入误差,就像你看到的那样。

如果你只是想要一个总结:计算机用二进制表示一切。二进制表示在执行浮点运算时,在某些情况下会导致微小的误差。


从double中减去int不会只更改double的整数部分。它还可以改变比例。在特定情况下,减法(6)之前的整数部分需要比减法(1)之后的整数部分更多的位来表示。这将导致数字的整个表示允许更多的小数位。结果可能有点出乎意料。(双关语)