Java long计算错误

时间:2015-04-27 12:59:53

标签: android long-integer

考虑这段代码:

            // 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&gt; = 52的情况下,间隔为:-1702967296,但应该是:2592000000

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

我在这里缺少什么? Android的最大值是否较小?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

正如拉尔托所说,添加一个&#39; L&#39;应该让它发挥作用。 但是,为了避免将来出现这类错误,您可以使用TimeUnit类(在Android SDK中提供):

  

long interval = TimeUnit.DAYS.toMillis(30);