2010-11-06 49 views
3

爲什麼第一個和第一個結果會有所不同?我猜它必須處理Long類型的限制。Java數學問題,結果不同!

long seconds = System.currentTimeMillis(); 
long first = (seconds/(1000*60*60*24))/365; 
long first1 = seconds/(1000*60*60*24*365); 
System.out.println(first); 
System.out.println(first1); 

謝謝!

回答

5

第二個分母的分母溢出int類型。

沒有區別,如果你不喜歡這樣 - 使用長全:

public class Overflow 
{ 
    public static void main(String[] args) 
    { 
     long seconds = System.currentTimeMillis(); 
     long first = (seconds/(1000L * 60L * 60L * 24L))/365L; 
     long i = 1000L * 60L * 60L * 24L * 365L; 
     long first1; 
     first1 = seconds/i; 
     System.out.println(i); 
     System.out.println(Integer.MAX_VALUE); 
     System.out.println(first); 
     System.out.println(first1); 
     System.out.println(first1/first); 
    } 
} 
+0

我要給出這個答案,因爲你的例子給我展示了一些我不知道的新東西(L後綴)。謝謝! – Mark 2010-11-06 21:11:04

+0

夠公平:) :) – 2010-11-06 21:14:04

+0

@Steve,這是正確的答案。整數除法會改變結果,但在這種情況下不足以影響最終的截斷值。溢出(我之前錯過的)是真正的問題。 – 2010-11-06 21:14:22

10

它因爲在第一個你除以int,它被截斷,然後除以另一個int。

在第二個,你只是除以int。

+0

正確,截斷。 – 2010-11-06 21:00:03

+0

太好了,謝謝! – Mark 2010-11-06 21:02:17