双减去int给出意想不到的结果

时间:2011-12-25 01:20:16

标签: java double int

  

可能重复:
  Floating point arithmetic not producing exact results in Java
  Floating point inaccuracy examples

在Java中,给出以下代码:

    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。但经过第二次计算,金额将为1.6600000000000001。我不明白为什么从double中减去一个int会导致这样的结果。

2 个答案:

答案 0 :(得分:2)

如果您需要核心解释,请阅读经典What Every Computer Scientist Should Know About Floating-Point Arithmetic。它解释了为什么浮点运算中不可避免地存在微小的舍入误差,就像你所看到的那样。

如果您只想要摘要:计算机代表二进制的所有内容。在进行浮点运算时,二进制表示会在某些情况下导致微小的不准确性。

答案 1 :(得分:1)

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