2009-08-19 17 views
12

perché 24 * 60 * 60 * 1000 * 1000 diviso per 24 * 60 * 60 * 1000 non uguale a 1000 in Java?perché 24 * 60 * 60 * 1000 * 1000 diviso per 24 * 60 * 60 * 1000 non uguale a 1000 in Java?

+23

Poiché Java si estende in direzione est-ovest, quindi il giorno è un po 'più lungo di 86400000000 microsecondi :-) – balpha

+8

Penso che per questa domanda abbia senso specificare che significa "int" e non "long". senza mostrare il codice attuale o specificando, la domanda è ambigua. questo è il tipo di domanda che odiavo nei test a scuola - dovrei rispondere "è * uguale a 1000" (corretto, se supponendo long) o dovrei supporre che il prof intendesse dire che tutto è stato fatto come ints, e quindi menzionare overflow? –

risposta

59

Poiché la moltiplicazione trabocca interi a 32 bit. In 64 bit va bene:

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 
    } 
} 

Ovviamente dopo la moltiplicazione è traboccato, la divisione non sta per "annullare" in overflow.

+1

Che cosa significa 1000 giorni * 1000 significa comunque? –

+24

Questi devono essere i nuovi "anni metrici" di cui parlano sempre. –

+7

1000 giorni * 1000 sarebbero 1.000.000 di giorni. Non c'è nulla di misterioso in questo. Ora, 1000 pollici x 1000 pollici è 1.000.000 pollici quadrati, quindi presumibilmente 1000 giorni x 1000 giorni sarebbero 1.000.000 di giorni quadrati. Ma non sono esattamente sicuro di cosa sia un "giorno quadrato". Forse questa è un'unità di misura che i viaggiatori del tempo usano quando si occupano di spazi bidimensionali. – Jay

22

È necessario iniziare con 24L * 60 * ... perché l'int overflow.

La tua domanda BTW è un copia/incolla di Puzzle 3: Long Division da Java Puzzlers;)

+0

+1 per costante lunga da forzare a lungo anziché int. –

3

Se si desidera eseguire tale calcolo, allora dovete o riordinare le operazioni (per evitare overflow) o utilizzare un tipo di dati più grande. Il vero problema è che l'aritmetica su interi a dimensione fissa in Java non è associativa; è un dolore, ma c'è il compromesso.

+0

riordinare i numeri non eviterà l'overflow – cherouvim

+0

@cherouvim, ma il riordino delle operazioni potrebbe. – Nosredna

+1

Credo che Thom stia parlando di riordinare la moltiplicazione in modo da fare invece una cosa del genere: ((24 * 60)/(24 * 60)) * ((1000 * 1000)/(1000 * 1000)) – DeadHead

Problemi correlati