2011-07-20 16 views
7
class LongDiv{ 
public static void main(String [] args){ 

    final long x = 24*60*60*1000*1000; 
    final long y = 24*60*60*1000; 
    System.out.println(x/y); 
} 
} 

雖然預期的答案是1000,但javac會將其作爲5.原因?Java中的長分區不按預期方式工作

+1

http://ideone.com/z78Sg –

+0

的http:// ideone。com/3vygF –

回答

13

x要創建不是您所期望的價值。它在整數範圍內。要建立多頭,使用:

final long x = 24L*60L*60L*1000L*1000L; 
final long y = 24L*60L*60L*1000L; 
System.out.println(x/y); 

x你計算,在整數的範圍,爲500654080。這除以y(= 86400000),結果爲5.794607407407407...。 Java的截斷這將導致5

之後,加入數字面的L小數部分,你告訴編譯器來編譯它作爲一個long而不是一個int。您所期望的x的值爲86400000000。但被編譯爲int。

我們可以將其截斷爲int的再現x500654080)錯誤值:

// First correct 
long x = 24L*60L*60L*1000L*1000L; 
/* x = `86400000000`; */ 
// Now truncate 
x &= 0xFFFFFFFFL; // again: don't forget the L suffix 
/* x = `500654080` */ 
+3

每個表達式中只有一個文字需要是「long」。見@彼得的答案。 –

+0

@Martijn:接受。但答案5如何? –

+0

我知道,但我認爲這是一種風格偏好。 –

5

表達24*60*60*1000*1000int類型不是long你想要的是24L*60*60*1000*1000這是long

這是你所擁有的。

final long x = (24*60*60*1000*1000) & 0xFFFFFFFF; 
final long y = (24*60*60*1000) & 0xFFFFFFFF; 
System.out.println(x/y); 

你想要的是

final long x = 24L*60*60*1000*1000; 
final long y = 24L*60*60*1000; 
System.out.println(x/y); 
+0

爲了明確它,你總是可以做'1L * 24 * 60 * 60 * 1000 * 1000'。 –

+0

在這種情況下,你可以做'(長)24 * 60 * 60 * 1000 * 1000' –

+0

什麼時候int-> long promotion會發生? 24或全部(無效)結果? –

1

24*60*60*1000*1000是太大,無法爲int和溢出。

1

棘手的一個!

問題是24,60和1000是Java文字整數。在將值分配給x和y之前,它們被截斷以適應int值。試試

System.out.print(x + ", " + y); 

看到我的意思。快速的解決辦法是讓你的文字轉換爲長值,就像這樣:

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

    final long x = 24l*60l*60l*1000l*1000l; 
    final long y = 24l*60l*60l*1000l; 
    System.out.println(x/y); 
} 
} 
+0

毆打!不像我想的那麼棘手,我想:) – Eric

2

鑄造在右操作數的文字值的情況下(強迫)長的作品;但問題仍然存在分配一個長變量到另一個,如下面給出的例子的情況下:

package utils; 

public class Utils { 

    public static void main(String ... clps){ 
     Utils.longDivision(); 
     Utils.doubleDivision(); 
    } 

    private static void doubleDivision(){ 
     double x=new Long("54321").doubleValue(); 
     double y=new Long("12345").doubleValue(); 
     double difference=x - y; 
     double percentage=(difference/x)*100.00; 
     System.out.println("\nDouble Division ==> X : "+x+" ; Y : "+y+" ; Difference : "+difference+" ; percentage : "+percentage+"\n"); 
    } 

    private static void longDivision(){ 
     long x=new Long("54321").longValue(); 
     long y=new Long("12345").longValue(); 
     long difference=x - y; 
     long percentage=(difference/x)*100L; 
     System.out.println("\nLong Division ==> X : "+x+" ; Y : "+y+" ; Difference : "+difference+" ; percentage : "+percentage+"\n"); 
    } 

} 

我能得到正確答案的唯一途徑是通過多頭劃分轉換成雙打的分工。爲什麼分裂多頭以這樣神祕的方式行事是很奇怪的。

longDivision給出了答案爲零,而doubleDivision給出了正確的答案。

我希望這可以幫助別人誰遇到過類似的問題...