问题
I'm attempting to calculate 30 days by multiplying milliseconds however the result continually ends up being a negative number for the value of days_30 and I'm not sure why.
Any suggestions are greatly appreciated!
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 value results in: -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){
Results in a smaller - but still negative number. -1.702967296E9
回答1:
You are multiplying ints
together, and overflow occurs because the maximum integer is 2^31 - 1. Only after the multiplications does it get converted to a long
. Cast the first number as a long
.
long days_30 = (long) 1000 * 60 * 60 * 24 * 30;
or use a long
literal:
long days_30 = 1000L * 60 * 60 * 24 * 30;
That will force long
math operations from the start.
回答2:
long days_30 = 1L * 1000 * 60 * 60 * 24 * 30;
回答3:
Just change your multiplication to long days_30 = 1000L * 60 * 60 * 24 * 30;
回答4:
Java has limitations when it comes to primitive data types. If your long or double are too big, then it will overflow into a negative number. Try using the BigInteger class for storing larger numbers.
Check this out:
How does Java handle integer underflows and overflows and how would you check for it?
来源:https://stackoverflow.com/questions/17221254/1000-60-60-24-30-results-in-a-negative-number