2012-04-26 105 views
0

因此,我目前正在阅读一本关于学习java的书,本书中概述的一个程序给了我一些麻烦。具体来说,当我运行程序来计算美元的金额和9.87应该有的变化时,我得到的结果会改变,就像我输入9.86一样。但是,当我输入9.86时,我得到正确的变化量。据我所知,这只会发生在一些以.87结尾的数量上,如8.87,尽管它可以用于6.87的罚款。这是java编程第8版的书介绍,由于它是一本由专业人士编写的书,我很困惑这个错误是什么。我曾尝试在cmd和eclipse中运行它,两者都显示错误。程序逻辑错误

引擎收录链接:

http://pastebin.com/CVssSUYp

+0

阅读float到int转换。简单的演员截断(向下舍入)。你想要一个“圆到最近”的转换。也就是说:'int remainingAmount =(int)((amount + 0.005)* 100);' – 2012-04-26 19:25:53

回答

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. 
} 
+0

好的,谢谢你的清理。澄清当我说“概述”时,我的意思是这本书的确切代码。我想他没有详细说明为什么像9.87这样的数字不起作用,因为他不想混淆或者稍后他会提及它,无论如何非常感谢你。 – Andrew 2012-04-27 00:33:11

0

duffymo是正确的。浮点数为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 

问候,

曼尼

0

尝试用100设置金额以9.87和然后乘以它:

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

后那试试打印同样的事情,但它转换成int:

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

铸造为int只是删除在最后的小数(如热舔在注释中说的)因为你不能代表浮点数准确(如duffymo在回答中说)你最终会得到986而不是你所期望的987。