1000 * 60 * 60 * 24 * 30 resulteert in een negatief getal

Ik probeer 30 dagen te berekenen door milliseconden te vermenigvuldigen, maar het resultaat is steeds een negatief getal voor de waarde days_30 en ik weet niet zeker waarom.

Alle suggesties worden zeer op prijs gesteld!

CODESNIPPET:

// 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 waarde resulteert 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){

Resulteert in een kleiner – maar nog steeds negatief getal. -1.702967296E9


Antwoord 1, autoriteit 100%

Je vermenigvuldigt intsmet elkaar, en overloop treedt op omdat het maximale gehele getal is 2^31 - 1. Pas na de vermenigvuldigingen wordt het omgezet in een long. Cast het eerste nummer als een long.

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

of gebruik een longletterlijke:

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

Dat dwingt vanaf het begin longwiskundige bewerkingen af.


Antwoord 2, autoriteit 8%

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

Antwoord 3, autoriteit 4%

Verander gewoon je vermenigvuldiging in long days_30 = 1000L * 60 * 60 * 24 * 30;


Antwoord 4

Java heeft beperkingen als het gaat om primitieve gegevenstypen. Als je long of double te groot is, zal deze overlopen in een negatief getal. Probeer de klasse BigInteger te gebruiken voor het opslaan van grotere getallen.

Bekijk dit eens:

Hoe gaat Java om met onder- en overlopen van gehele getallen en hoe zou u hierop controleren?

Other episodes