8

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

NoobDev954
  • 119
  • 1
  • 3
  • 11

4 Answers4

29

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.

rgettman
  • 176,041
  • 30
  • 275
  • 357
2
   long days_30 = 1L * 1000 * 60 * 60 * 24 * 30;
ZhongYu
  • 19,446
  • 5
  • 33
  • 61
1

Just change your multiplication to long days_30 = 1000L * 60 * 60 * 24 * 30;

Guillaume Darmont
  • 5,002
  • 1
  • 23
  • 35
0

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?

Community
  • 1
  • 1
  • A `long` is good enough in this case – Steve Kuo Jun 20 '13 at 18:58
  • If "Computers have limitations when it comes to numbers", then how would BigInteger help? – Steve Kuo Jun 20 '13 at 18:59
  • If a `double` goes beyond its range, then `POSITIVE_INFINITY` (or `NEGATIVE_INFINITY`) results, not an overflow. – rgettman Jun 20 '13 at 19:01
  • I'm sorry for the unclear explanation. Java limits primitive data types. For example, longs and doubles are 64 bits (excluding over head). However, if you use a Java object (or a class that extends from Object), the size can as large as the computer's memory is (or whatever the remaining space is before it crashes lol). – But I'm Not A Wrapper Class Jun 20 '13 at 19:29