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 ints
met 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 long
letterlijke:
long days_30 = 1000L * 60 * 60 * 24 * 30;
Dat dwingt vanaf het begin long
wiskundige 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?