2016-03-05 81 views
0

例1:浮長類型轉換問題在Java

public class Test { 

public static void main(String args[]){ 
long l1 =8589934592L; 
float f1= l1; 
long l2= (long)f1; 
System.out.println("Input long::"+l1); 
System.out.println("Float value::"+f1); 
System.out.println("Typecasted value::"+l2); 
} 
} 
     Output of for first class: 
     Input long::8589934592 
     Float value::8.5899346E9 
     Typecasted value::8589934592 

例2:

public class Test { 

public static void main(String args[]){ 
long l1 =6788819226L; 
float f1= l1; 
long l2= (long)f1; 
System.out.println("Input long::"+l1); 
System.out.println("Float value::"+f1); 
System.out.println("Typecasted value::"+l2); 
} 
} 
     Output of for second class: 
     Input long::6788819226 
     Float value::6.7888195E9 
     Typecasted value::6788819456 

鑄字沒有發生正常。兩個類都有不同的行爲。 爲什麼示例2在類型轉換後具有不同的值。請讓我知道原因?

回答

1

浮點數沒有足夠的精度來編碼這個數字。 如果使用雙,這是可行的:

public class Test { 

    public static void main(final String args[]) { 
     long l1 = 6788819226L; 
     double f1 = l1; 
     long l2 = (long) f1; 
     System.out.println("Input long::" + l1); 
     System.out.println("Double value::" + f1); 
     System.out.println("Typecasted value::" + l2); 
    } 
} 

輸出:

Input long::6788819226 
Double value::6.788819226E9 
Typecasted value::6788819226 

您可以閱讀https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3瞭解浮動的具體限制。 要給出一個近似值,最大爲2^24的整數將精確地保存在浮點數中,之後它可以是一個近似值(或確切數值,具體取決於數值)。對於雙打,這將達到2^53。

你的第一個例子正確運行的原因是因爲8589934592是2的冪,因爲它的近似值等於數字(如果你閱讀了規範,你會明白這一點)。

0

你會得到幾乎相同的結果,儘管如果你不習慣使用1E值的科學符號,它們可能看起來與你完全不同。請注意,浮點表示中的數字之間有E

在數字格式,6.7888195E9裝置6.7888195 * 10^9,這是因爲6788819226但較少精度大致相同。在float類型中,它不能給出更多細節,因爲您的數字大於最大數量float類型變量可以存儲在其中。

嘗試用更小的數字,這float可以存儲所有號碼,而不會丟失任何精度:

long l1 =8589944L; 
    float f1= (float) l1; 
    long l2= (long)f1; 
    System.out.println("Input long::"+l1); 
    System.out.println("Float value::"+f1); 
    System.out.println("Typecasted value::"+l2); 

你會發現,結果是:

Input long::8589944 
    Float value::8589944.0 
    Typecasted value::8589944 

它看起來熟悉。這表明您的示例中浮點值的表示法使用了E表示法,表明它是一個很大的數字,這表明它可能會失去一些精度。當我們用指數形式寫數學術語時,數字通常很大,我們傾向於少用小數值。

類型float提供較低的精度,因爲float存儲數字的位數較少。位數較少意味着它使用較少的內存,但與長期相比,其精度有限。 long使用比float更多的比特(1和在計算機內存中0),如果你把它放在二進制數的形式long會比float更多1s0s,這就是爲什麼它被稱爲long

在Java中,long使用64位,並且float使用32位。更多詳情,請致電here

我希望這可以幫助你瞭解發生了什麼。