2014-12-11 8 views
5

Voglio calcolare il volume di una sfera usando un programma Java. Quindi, ho usatojava 2 diversi problemi di formula

double result = 4/3*Math.PI*Math.pow(r,3); 

Questa formula dà le risposte sbagliate a quanto pare.

programma come Java optare 4/3, ma se cambio a

double result= Math.PI*Math.pow(r,3)*4/3; 

mi dà la risposta corretta. Qualcuno sa cosa sta succedendo?

+0

1. formattazione, 2.divisione intera (4/3) e 3. ordine di funzionamento in java. Assicurati che queste 3 cose siano controllate. –

+2

Ho appena corretto il formato e la maggior parte del fraseggio. Per la prossima volta, prenditi il ​​tuo tempo per rendere la tua domanda presentabile e leggibile. Usa la punteggiatura, caratteri maiuscoli, se necessario, e usa i tag del codice, in modo che vengano evidenziati correttamente. – brimborium

risposta

3

La differenza nel risultato è dovuta alla precedenza dell'operatore. In Java, la moltiplicazione e la divisione hanno la stessa precedenza e quindi vengono valutate da sinistra a destra.

Così, il vostro primo esempio è equivalente a

double result = (4/3)*Math.PI*Math.pow(r,3); 

Qui, 4/3 è una divisione di due numeri interi, e in Java, in questi casi, viene eseguita la divisione intera, con esito 1. Per risolvere questo , si deve fare in modo esplicito in modo che uno o entrambi degli operandi è un doppio:

double result = (4.0/3.0)*Math.PI*Math.pow(r,3); 

tuo secondo esempio, invece, è equivalente a

double result = (Math.PI*Math.pow(r,3)*4)/3; 

Qui, la parte Math.PI*Math.pow(r,3)*4 viene valutata come doppia, quindi non abbiamo più divisione intera e si ottiene il risultato corretto.

+0

Questa è la risposta più elaborata. -> +1 – brimborium

5

Questo ha a che fare con l'ordine in cui avviene la trasmissione in Java (o C per quella materia).

Per tutti i dettagli sulla precedenza degli operatori, vedere http://introcs.cs.princeton.edu/java/11precedence/.

Nel primo caso, poiché gli operatori di moltiplicazione e divisione sono calcolati da sinistra a destra, la prima operazione interpretata da java è 4/3. Poiché entrambi gli operandi sono interi, java calcola una divisione intera, il cui risultato è 1.

Nel secondo caso, la prima operazione è il doppio multiplo: (Math.PI Math.pow (r, 3)) . La seconda operazione moltiplica una doppia (Math.PI Math.pow (r, 3)) da un numero intero (4). Questo viene eseguito colando 4 su un doppio e eseguendo un doppio multiplo. Infine, java deve dividere un doppio (Math.PI * Math.pow (r, 3) * 4) da un numero intero (3), che java esegue come doppia divisione dopo aver lanciato 3 in un doppio. Questo ti dà il risultato che ti aspetti.

Se si vuole correggere la prima risposta, Fusioni 3 a raddoppiare prima:

4/ (double)3 

e si otterrà il risultato che ci si aspetta.

+1

C'è un vantaggio per '(double) 3' invece di' 3.0'? – brimborium

+1

Nessuno di quelli che conosco da un punto di vista programmatico. Ma io tendo ad usare la notazione esplicita (doppia) del casting perché più di una volta sono stato bruciato dimenticando il '.' quando si modifica il valore di una costante in seguito. Per esempio. Inizialmente ho un pezzo di codice con qualcosa come double x = 3.14/2; e più tardi ho bisogno di cambiare la mia formula, per esempio, double x = 3.0/2; ma potrei inavvertitamente scrivere double x = 3/2; soprattutto con una formula lunga. Se il (doppio) è lì, resta lì per rinforzare il cast, indipendentemente dal valore. È una salvaguardia che mi piace avere. – Lolo

+0

Di solito uso sempre '.', quindi dovrei fare' x = 3.14/2.0' in primo luogo. E penso che sia più leggibile rispetto a farlo in modo esplicito. – brimborium

2

4/3 è una divisione tra due int, così Java presuppone che il risultato è anche un int (in questo caso, ciò si traduce nel valore 1). Cambialo in 4.0/3.0 e starai bene, perché 4.0 e 3.0 sono interpretati come double da Java.

double result = 4.0/3.0 * Math.PI * Math.pow(r,3);