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);