Pourquoi (360/24) / 60 = 0… en Java
-
21-09-2019 - |
Question
J'essaie de calculer (360/24)/60. Je continue à obtenir la réponse 0,0 alors que je devrais obtenir 0,25.
Dans les mots:Je veux diviser 360 par 24 puis diviser le résultat par 60
public class Divide {
public static void main(String[] args){
float div = ((360 / 24) / 60);
System.out.println(div);
}
}
Ceci imprime :
0.0
Pourquoi donc?Est-ce que je fais quelque chose de vraiment stupide ou y a-t-il une bonne raison à cela
La solution
Aucun des opérandes dans l'arithmétique est un flotteur - il est donc tout se fait avec l'arithmétique entière et puis converti en un flotteur. Si vous changez le type d'un opérande approprié à un flotteur, cela fonctionnera bien:
float div = ((360 / 24f) / 60); // div is now 0.25
Notez que si vous avez changé seulement 60 être un flotteur, vous finiriez avec le 360/24 en cours d'exécution en arithmétique entière - ce qui est bien dans ce cas particulier, mais ne représente pas ce que je soupçonne que vous avez vraiment l'intention . Fondamentalement, vous devez vous assurer que l'opération arithmétique est effectuée de la manière que vous voulez.
Autres conseils
Vous êtes en train de faire la division entière ( 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;
Pour la division à virgule flottante, au moins un des opérandes doivent être un type numérique à virgule flottante.
float div = ((360F / 24) / 60);
float div = 15F / 60;
float div = 0.25F;
Astuce: si la précision est importante, vous voulez faire autant du calcul avec double
, avant de se convertir à float
. En fait, à moins que votre profil démontre que vous avez absolument besoin que float
, vous devriez toujours préférer 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"
Dans votre méthode principale,
public static void main(String[] args){
float div = ((360 / 24) / 60);
System.out.println(div);
}
Notez que 360, 24 et 60 sont tous des valeurs entières.Vous obtiendrez ainsi des valeurs étranges.
360/24 -> 15 (parfaitement bien)
15 / 60 -> 0,4 (virgule flottante)
Malheureusement pour vous les nombres à virgule flottante sont tronqués donc vous obtenez :
-> 0 (integer value)
Ensuite, en attribuant 0 à une variable à virgule flottante, vous remplacez 0 par une valeur à virgule flottante, 0,0.Donc le résultat.
Si vous souhaitez les diviser, vous devez les changer en valeurs à virgule flottante.
Le code correct doit être le suivant :
public static void main(String[] args){
float div = ((360.0 / 24.0) / 60.0);
System.out.println(div);
}