1000 * 60 * 60 * 24 * 30结果为负数

时间:2013-06-20 18:37:02

标签: java android math long-integer negative-number

我试图通过乘以毫秒来计算30天,但结果不断变为days_30值的负数,我不知道为什么。

非常感谢任何建议!

CODE SNIPPET:

// check to ensure proper time has elapsed
                SharedPreferences pref = getApplicationContext()
                        .getSharedPreferences("DataCountService", 0);
                 long days_30 = 1000 * 60 * 60 * 24 * 30;
                 long oldTime = pref.getLong("smstimestamp", 0);
                long newTime = System.currentTimeMillis();
                 if(newTime - oldTime >= days_30){

days_30值导致:-1702967296

P.S。

 double days_30 = 1000 * 60 * 60 * 24 * 30;
                 double oldTime = pref.getLong("smstimestamp", 0);
                double newTime = System.currentTimeMillis();
                 if(newTime - oldTime >= days_30){

结果是较小但仍为负数。 -1.702967296E9

4 个答案:

答案 0 :(得分:20)

您将ints相乘,并且因the maximum integer is 2^31 - 1而发生溢出。只有在乘法之后它才会转换为long。将第一个数字转换为long

long days_30 = (long) 1000 * 60 * 60 * 24 * 30;

或使用long字面值:

long days_30 = 1000L * 60 * 60 * 24 * 30;

这将从一开始就强制long数学运算。

答案 1 :(得分:2)

   long days_30 = 1L * 1000 * 60 * 60 * 24 * 30;

答案 2 :(得分:1)

只需将乘法更改为long days_30 = 1000L * 60 * 60 * 24 * 30;

答案 3 :(得分:0)

Java在原始数据类型方面存在局限性。如果您的长或双太大,那么它将溢出为负数。尝试使用BigInteger类来存储更大的数字。

检查出来:

How does Java handle integer underflows and overflows and how would you check for it?