2013-04-17 43 views
3

考虑简单的代码Java的简单的数学异常

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 


public class Main { 


    public static void main(String args[]){ 
     System.out.println(isFresh("2013-03-26 06:25:34")); 
    } 

    private static boolean isFresh(String ts){ 

     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     Date date = new Date(); 
     try { 
      date = sdf.parse(ts); 

      if((new Date().getTime() - date.getTime())>(24*40*60*60*1000)){ //Ignore events before 40 days. 
       return true; 
      } 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     return false; 
    } 
} 

现在,程序打印真,如果我运行它。但如果我用3456000000.0替换24 * 40 * 60 * 60 * 1000,它将返回False。请注意,我在最后附加了一个.0,以便Java将它视为double而不是int。 int不能取那么大的数字,但是可以取两倍。

这是为什么?我怀疑这有些事情需要做内部代表数字的方式。

+0

“int不会采取大量的,但双可以“ – sashkello

+0

您可以使用3456E6而不是 –

+0

在侧面说明,最好使用更高级别的api来处理这种类型的ta sks:jodatime或至少内置日历 –

回答

3

你正遇到整数溢出与24*40*60*60*1000。当你使用3456000000.0时,没有溢出,因为如你所说,它是双倍的。因此,不同的结果。

我们可以通过双打避免溢出:

24.0 * 40.0 * 60.0 * 60.0 * 1000.0 

或多头:

24L * 40L * 60L * 60L * 1000L 
+0

谢谢。这消除了我的代码中的一个重大错误。 –