2009-08-19 31 views
12

¿por qué 24 * 60 * 60 * 1000 * 1000 dividido por 24 * 60 * 60 * 1000 no es igual a 1000 en Java?¿por qué 24 * 60 * 60 * 1000 * 1000 dividido por 24 * 60 * 60 * 1000 no es igual a 1000 en Java?

+23

Dado que Java se extiende en dirección este-oeste, entonces el día es un poco más largo que 86400000000 microsegundos :-) – balpha

+8

Creo que para que esta pregunta tenga sentido debe especificar que significa int y no long. sin mostrar el código real o especificar, la pregunta es ambigua. este es el tipo de pregunta que odiaba en las pruebas en la escuela: ¿se supone que debo responder que "es * igual a 1000" (correcto, si se asumen largos) o se supone que debo adivinar que el profesor quería decir que todo estaba siendo hecho como ints, y por lo tanto mencionan overflow? –

Respuesta

59

Porque la multiplicación desborda los enteros de 32 bits. En 64 bits de que está bien:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     int intProduct = 24 * 60 * 60 * 1000 * 1000; 
     long longProduct = 24L * 60 * 60 * 1000 * 1000; 
     System.out.println(intProduct); // Prints 500654080 
     System.out.println(longProduct); // Prints 86400000000 
    } 
} 

Obviamente después de la multiplicación se ha desbordado, la división no va a "deshacer" que se desbordan.

+1

¿Qué significa 1000 días * 1000 de todos modos? –

+24

Esos deben ser los nuevos "años métricos" de los que siempre hablan. –

+7

1000 días * 1000 serían 1,000,000 días. No hay nada misterioso en eso. Ahora, 1000 pulgadas x 1000 pulgadas son 1,000,000 pulgadas cuadradas, así que presumiblemente 1000 días x 1000 días serían 1,000,000 de días cuadrados. Pero no estoy exactamente seguro de qué es un "día cuadrado". Quizás esa es una unidad de medida que los viajeros del tiempo usan cuando se trata de espacio pan-dimensional. – Jay

22

Debe comenzar con 24L * 60 * ... porque el int se desborda.

Su pregunta BTW es un copiar/pegar de Puzzle 3: Long Division de Java Puzzlers;)

+0

+1 para una constante larga para forzar long en lugar de int. –

3

Si desea realizar este cálculo, entonces debe o bien volver a ordenar las operaciones (para evitar el desbordamiento) o use un tipo de datos más grande. El verdadero problema es que la aritmética en enteros de tamaño fijo en Java no es asociativa; es un dolor, pero hay una compensación.

+0

reordenar los números no evitará el desbordamiento – cherouvim

+0

@cherouvim, pero el reordenamiento de las operaciones podría. – Nosredna

+1

Creo que Thom está hablando de reordenar la multiplicación para que haga algo como esto en su lugar: ((24 * 60)/(24 * 60)) * ((1000 * 1000)/(1000 * 1000)) – DeadHead

Cuestiones relacionadas