2011-11-17 61 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以外的數據類型)。