Java long计算错误
Java long is calculated wrongly
考虑这段代码:
// 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
我在这里缺少什么? Android 最大值是否为 long 更小?
您正在计算 32 位有符号整数,计算溢出,然后您将结果分配给一个 long。
通过将其中一个操作数设为长整数来进行 64 位计算。例如,将 L
添加到其中一个操作数以使其成为长文字:
interval = 1000L*60*60*24*30;
正如 laalto 所说,添加 'L' 应该可以正常工作。
但是,为了避免将来出现此类错误,您可以使用 TimeUnit class(在 Android SDK 中可用):
long interval = TimeUnit.DAYS.toMillis(30);
考虑这段代码:
// 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
我在这里缺少什么? Android 最大值是否为 long 更小?
您正在计算 32 位有符号整数,计算溢出,然后您将结果分配给一个 long。
通过将其中一个操作数设为长整数来进行 64 位计算。例如,将 L
添加到其中一个操作数以使其成为长文字:
interval = 1000L*60*60*24*30;
正如 laalto 所说,添加 'L' 应该可以正常工作。 但是,为了避免将来出现此类错误,您可以使用 TimeUnit class(在 Android SDK 中可用):
long interval = TimeUnit.DAYS.toMillis(30);