java - 60*60*5
1000*60*60*24*30 da como resultado un nĂºmero negativo (4)
Esta pregunta ya tiene una respuesta aquí:
Estoy intentando calcular 30 días multiplicando milisegundos, sin embargo, el resultado continúa siendo un número negativo para el valor de days_30 y no estoy seguro de por qué.
¡Cualquier sugerencia es bienvenida!
FRAGMENTO DE CÓDIGO:
// 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){
los resultados del valor days_30 en: -1702967296
PD
double days_30 = 1000 * 60 * 60 * 24 * 30;
double oldTime = pref.getLong("smstimestamp", 0);
double newTime = System.currentTimeMillis();
if(newTime - oldTime >= days_30){
Resultados en un número más pequeño, pero aún negativo. -1.702967296E9
Está multiplicando ints
juntos, y se produce un desbordamiento porque el entero máximo es 2^31 - 1
. Solo después de las multiplicaciones se convierte a una long
. Echa el primer número como un long
.
long days_30 = (long) 1000 * 60 * 60 * 24 * 30;
o usa un long
literal:
long days_30 = 1000L * 60 * 60 * 24 * 30;
Eso obligará a operaciones matemáticas long
desde el principio.
Simplemente cambie su multiplicación por long days_30 = 1000L * 60 * 60 * 24 * 30;
long days_30 = 1L * 1000 * 60 * 60 * 24 * 30;
Java tiene limitaciones cuando se trata de tipos de datos primitivos. Si su largo o doble es demasiado grande, se desbordará en un número negativo. Intente utilizar la clase BigInteger para almacenar números más grandes.
Mira esto:
¿Cómo maneja Java los flujos y desbordamientos enteros y cómo lo verificaría?