我试图通过乘以毫秒来计算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
答案 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?