2010-11-06 50 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