Java long计算错误



考虑这段代码:

// 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,但应该为:2592000000

减号表示某种溢出错误。然而,Java中long的最大值是2E63-1,即:9.2233E18

我在这里缺少什么?安卓系统的最大值是不是长得更小?

您正在计算32位有符号的int,计算溢出,然后将结果分配给long。

通过将其中一个操作数设为长,以64位进行计算。例如,将L添加到其中一个操作数,使其成为长文字:

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

正如laalto所说,添加一个"L"应该可以使其工作。然而,为了避免将来出现此类错误,您可以使用TimeUnit类(在Android SDK中可用):

长间隔=时间单位。DAYS。to Millis(30);

最新更新