Perché (360/24) / 60 = 0 … in Java

Sto cercando di calcolare (360/24) / 60 Continuo a ricevere la risposta 0.0 quando dovrei ottenere 0.25

A parole: voglio dividere 360 ​​per 24 e poi dividere il risultato per 60

public class Divide { public static void main(String[] args){ float div = ((360 / 24) / 60); System.out.println(div); } } 

Questo stampa:

0.0

Perché? Sto facendo qualcosa di veramente stupido, o c’è una buona ragione per questo

Nessuno degli operandi dell’aritmetica è un float, quindi viene eseguito interamente con l’aritmetica dei numeri interi e quindi convertito in float. Se si modifica il tipo di un operando appropriato in un float, funzionerà correttamente:

 float div = ((360 / 24f) / 60); // div is now 0.25 

Nota che se hai cambiato solo 60 come float, ti ritroverai con il 360/24 eseguito come aritmetica intera – che va bene in questo caso particolare, ma non rappresenta ciò che sospetto tu intendessi realmente. Fondamentalmente è necessario assicurarsi che l’operazione aritmetica venga eseguita nel modo desiderato.

In realtà stai facendo la divisione in interi ( JLS 15.17.2 ).

 float div = ((360 / 24) / 60); float div = (float) ((360 / 24) / 60); float div = (float) (15 / 60); float div = (float) (0); float div = 0F; 

Per eseguire la divisione in virgola mobile, almeno uno degli operandi deve essere un tipo numerico a virgola mobile.

 float div = ((360F / 24) / 60); float div = 15F / 60; float div = 0.25F; 

Suggerimento: se la precisione è importante, si desidera eseguire la maggior parte del calcolo con il double , prima di convertirlo in float . Infatti, a meno che il tuo profilo non dimostri che hai assolutamente bisogno di float , dovresti sempre preferire il double .

  float f; f = (1E-17F * 1E-17F); System.out.println(f); // prints "9.999999E-35" f = (float) (1E-17D * 1E-17D); System.out.println(f); // prints "1.0E-34" 

Nel tuo metodo principale,

 public static void main(String[] args){ float div = ((360 / 24) / 60); System.out.println(div); } 

Notare che 360, 24 e 60 sono tutti valori interi. Come tale otterrete valori strani.

360/24 -> 15 (perfettamente a posto)
15/60 -> 0,4 ​​(virgola mobile)

Sfortunatamente per te i numeri in virgola mobile vengono troncati e ottieni:

 -> 0 (integer value) 

Quindi, assegnando 0 a una variabile in virgola mobile, si cambia 0 in un valore in virgola mobile, 0.0. Quindi il risultato.

Se si desidera dividerli è necessario modificarli in valori in virgola mobile.

Il codice corretto dovrebbe essere come tale:

 public static void main(String[] args){ float div = ((360.0 / 24.0) / 60.0); System.out.println(div); }