8

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

任何建议都非常感谢!

代码片段:

// 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

附言

 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

4 回答 4

29

您正在相乘ints,并且发生溢出是因为最大整数是2^31 - 1。只有在乘法之后,它才会转换为long. 将第一个数字转换为long.

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

或使用long文字:

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

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

于 2013-06-20T18:39:18.423 回答
2
   long days_30 = 1L * 1000 * 60 * 60 * 24 * 30;
于 2013-06-20T18:39:09.393 回答
1

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

于 2013-06-20T18:40:57.620 回答
0

Java 在原始数据类型方面存在局限性。如果你的 long 或 double 太大,那么它会溢出成负数。尝试使用 BigInteger 类来存储更大的数字。

看一下这个:

Java 如何处理整数下溢和上溢以及如何检查它?

于 2013-06-20T18:42:09.123 回答