2010-03-19 4 views
14

Je suis en train de calculer (360/24)/60 Je continue de recevoir la réponse 0.0 quand je devrais obtenir 0,25(360/24)/60 = 0 ... en Java

En d'autres termes: I veulent 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 affiche:

0,0

Pourquoi est-ce? Est-ce que je fais quelque chose de vraiment stupide, ou est-il une bonne raison pour cette

+1

J'ai essayé la même chose avec GCC (C) et il subit le même problème. –

Répondre

29

Aucun des opérandes dans l'arithmétique est un flotteur - il est donc tout 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 comme arithmétique entière - ce qui est bien dans ce cas particulier, mais ne représente pas ce que je soupçonne que vous vouliez vraiment. Fondamentalement, vous devez vous assurer que l'opération arithmétique est effectuée de la manière que vous voulez.

+0

Plus exact: 360/24 = 15 15/60 = 0 Arrondi toujours aux entiers;) – TomTom

+7

* soupir *. Les littéraux numériques monomorphes confondent les gens. Les littéraux polymorphes numériques confondent les gens. Vous ne pouvez pas gagner. –

24

Vous effectuez réellement la division entière (JLS 15.17.2). Pour faire une division en virgule flottante, au moins l'un des opérandes doit être de 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 profilage démontre que vous avez absolument besoin de 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" 
+0

ne voulez-vous pas dire «double» dans «En fait, vous devriez probablement utiliser« float »presque toujours»? –

+0

Oui, quelques fautes de frappe. Fixé. – polygenelubricants

2

Dans votre principale méthode,

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

Notez que 360, 24 et 60 sont toutes les valeurs entières. En tant que tel, vous obtiendrez des valeurs étranges.

360/24 -> 15 (parfaitement bien)
15/60 -> 0,4 ​​(virgule flottante)

Malheureusement pour vous les nombres à virgule flottante sont tronquées ainsi que vous obtenez:

-> 0 (integer value) 

Ensuite, en affectant 0 à une variable à virgule flottante, vous changez 0 en une valeur à virgule flottante, 0,0. Ainsi le résultat.

Si vous souhaitez les diviser, vous devez les modifier en valeurs à virgule flottante.

Le code correct devrait être en tant que tel:

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