2012-09-27 14 views
8

Estoy tratando de hacer algunas cosas básicas de cálculo en mi aplicación Android para comparar un valor de Date.getTime() con algunas cosas calculadas.Android/Java: long se vuelve negativo sin exceder max_value

El cálculo que hago durante una consulta de base de datos es:

long minus = pauseDays * 24 * 60 * 60 * 1000; 

Así que básicamente calcular el valor de milisegundos pauseDays. Si pauseDays se agranda (estoy hablando de 90 días más o menos), sucede algo extraño. El resultado del cálculo es un número negativo.

Lo raro es que el resultado debería ser 7776000000, por lo que debería ser mucho más pequeño que Long.MAX_VALUE. ¿Alguien podría explicarme por qué obtengo un número negativo aquí?

Respuesta

21

La razón probablemente sea porque pauseDays es un tipo int, ¿no? Luego lo está multiplicando por otro grupo de int s, y luego convirtiéndolo a long.

Considere this:

public class Main { 
    public static void main(String[] args) { 
    int pauseDays = 90; 
    long minus = pauseDays * 24 * 60 * 60 * 1000; 
    System.out.println(minus); 

    long pauseDaysL = 90L; 
    long minusL = pauseDaysL * 24L * 60L * 60L * 1000L; 
    System.out.println(minusL); 
    } 
} 

La salida de este es:

-813934592 
7776000000 

en cuenta que la primera long minus utiliza enteros para generar su valor. El segundo long minusL usa todos los valores enteros largos.

+0

Dale un golpe :) +1 – Brian

+0

Gracias, eso resolvió mis problemas :) Totalmente pasé por alto el hecho de que pauseDays es un valor INT. – user1515310

Cuestiones relacionadas