2013-04-17 83 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

謝謝。這消除了我的代碼中的一個重大錯誤。 –