2011-11-17 63 views
4

Java中的以下简单的代码几乎不含3语句虽然它看起来像它应该返回真正返回意外一个简单的Java代码,返回意外错误而它intened返回true

package temp; 

final public class Main 
{ 
    public static void main(String[] args) 
    {   

     long temp = 2000000000; 
     float f=temp; 

     System.out.println(f<temp+50); 
    } 
} 

上面的代码显然应该在控制台上显示真正但事实并非如此。它会显示false。为什么?

+1

为什么你首先将它转换成“float”? – NullUserException

+1

实际上这个代码没有它自己的意义。我只是想检查为什么这种情况被评估为错误,并且有些让我吃惊,我只是决定在这里问。 – Lion

回答

14

这是因为floating point arithmetic != real number arithmetic

f被分配到2000000000时,它被转换为2.0E9。然后,当您将50添加到2.0E9时,其值不会改变。所以实际上,(f == temp + 50)true

如果您需要大量的工作,但需要精确,你必须使用类似BigDecimal

long temp = 2000000000; 
BigDecimal d = new BigDecimal(temp); 

System.out.println(d.compareTo(new BigDecimal(temp+50)) < 0); 

将打印true正如人们所预期的。

(虽然在你的情况下,我不知道你为什么需要使用除long以外的数据类型)。