2015-04-27 64 views
0

考慮這一段代碼:爪哇長被錯誤地計算

  // calculate age of dog 
      long interval = 1000*60*60*24*30; 
      int ageInWeeks = Weeks.weeksBetween(geburtsDatumDateTime, nowDateTime).getWeeks(); 
      if (ageInWeeks < 20){ 
       // wöchentlich 
       interval = 1000*60*60*24*7; 
      } else if (ageInWeeks >= 20 && ageInWeeks < 52){ 
       // 2-wöchentlich 
       interval = 1000*60*60*24*14; 
      } else if (ageInWeeks >= 52){ 
       // monatlich 
       interval = 1000*60*60*24*30; 
      } 

調試器顯示的是,在ageInWeeks> = 52的時間間隔的情況下是:-1702967296,但它應該是:25.92億

減號表示某種溢出錯誤。 然而Java中long的最大值是2E63-1,它是:9.2233E18

我在這裏錯過了什麼?是一個較長的較小的Android最大值?

+0

您可以用'Long.MAX_VALUE' –

回答

3

您正在計算32位signed int,計算溢出,然後您將結果分配給long。

通過使其中一個操作數變長,以64位進行計算。例如,添加L到一個操作數,使之成爲長的文字:

interval = 1000L*60*60*24*30; 
+1

他不應該做的最左邊的數字爲'long'檢查長的最大值,因爲整數乘法可能溢出它得到了'30L'前? –

+0

在這種情況下並不重要,但通常這樣做更有意義,謝謝。 – laalto

+0

@laalto完全如您所說。謝謝。 – mrd

0

正如laalto說,一個「L」應該使其工作。 然而,對於避免這些樣的錯誤,在未來,你可以使用TIMEUNIT類(可在Android SDK中):

長間隔= TimeUnit.DAYS.toMillis(30);