2012-04-11 30 views
0

如果我使用不同日期調用此方法,則差異/ 1000L/60L/60L/24L結果的小數位將始終被截斷。我能做些什麼來防止這種情況發生?我需要4.xx的結果。Java日期計算在結果處截斷小數點

public boolean checkDelayed(Date date1, Date date2) 
{ 
    long difference = date2.getTime() - date1.getTime(); 

    if (difference/1000L/60L/60L/24L <= 4L) 
    { 
     return true; 
    } 

    return false; 
} 

回答

3

嘗試使用雙打而不是長鍵。

public boolean checkDelayed(Date date1, Date date2) 
{ 
    double difference = (double) (date2.getTime() - date1.getTime()); 

    if (difference/1000d/60d/60d/24d <= 4d) 
    { 
     return true; 
    } 

    return false; 
} 

最好的辦法是應用簡單的數學。你的情況是這樣的:

difference/1000L/60L/60L/24L <= 4L 

制定出這樣的:

 difference/60L/60L/24L <= 4000L 
       difference/60L/24L <= 240000L 
        difference/24L <= 14400000L 
          difference <= 345600000L 

有你有它。始終工作的簡單條件。

public boolean checkDelayed(Date date1, Date date2) 
{ 
    long difference = date2.getTime() - date1.getTime(); 

    if (difference <= 345600000L) 
    { 
     return true; 
    } 

    return false; 
} 

所有這一切的原因是,長數據類型不支持十進制值。通過轉換爲雙精度值,您將可以保留十進制值。

+0

作品,謝謝。好吧,我忘記了多長時間不支持小數。 – Bevor 2012-04-11 13:29:03

+1

每次分割兩個整數值即「long」時,十進制值將被丟棄。這意味着您在「差異/ 1000L/60L/60L/24L <= 4L」操作中會損失精度4次。 – mcfinnigan 2012-04-11 13:33:43

1

而不是多頭,你也可以乘,而不是分。

if (difference <= 4 * 1000 * 60 * 60 * 24) 
{ 
    return true; 
} 

分割比較慢,並且可能會裁剪掉一些數字。即使分開整數比浮點數或雙精度浮點數要慢(在某些情況下,例如AMD最好使用浮點數,Intel使用整數)。使用BigDecimal.divide(...)而不是double會防止修剪,但會更慢。

乘法的唯一缺點我能想到的是一個非常大的數字會溢出(即計算的int可能大於Integer.MAX_VALUE,或長於Long.MAX_VALUE的長度)。但就你而言,你只有常數,所以它是最好的選擇。

+0

好的提示,謝謝。 – Bevor 2012-04-11 13:38:43