2009-04-24 6 views
101

Dans un autre exercice de Bruce Eckels dans le calcul de la vitesse, v = s/t où s et t sont des entiers. Comment puis-je faire pour que la division lance un flotteur?Comment faire la division de 2 ints produire un flotteur au lieu d'un autre int?

class CalcV { 
    float v; 
    float calcV(int s, int t) { 
    v = s/t; 
    return v; 
    } //end calcV 
} 

public class PassObject { 

    public static void main (String[] args) { 
    int distance; 
    distance = 4; 

    int t; 
    t = 3; 

    float outV; 

    CalcV v = new CalcV(); 
    outV = v.calcV(distance, t); 

    System.out.println("velocity : " + outV); 
    } //end main 
}//end class 

Répondre

219

Il vous suffit de lancer l'un des deux opérandes en premier.

v = (float)s/t; 

La dominante est plus prioritaire que la division, ce qui se produit avant la division.

L'autre opérande sera automatiquement converti en flottant par le compilateur car les règles indiquent que si l'un des opérandes est de type virgule flottante, l'opération sera une opération à virgule flottante, même si l'autre opérande est intégral. Java Language Specification, §4.2.4 et §15.17

+7

Grrr, cela m'a pris environ 30 minutes jusqu'à ce que je trouve cela et figuré IT out. Si simple. : D – Rihards

+0

Plus précisément, cette règle particulière est mentionnée ici: [Opérateurs multiplicatifs] (http://java.sun.com/docs/books/jls/third%5Fedition/html/expressions.html#239829), alors laissez-le se tenir ici pour référence future. – quantum

+5

(Pour toute personne rencontrant cette question plus tard, les liens donnés sont cassés, les nouveaux sont: http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2 .4 et http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17) –

2

Vous pouvez lancer le numérateur ou le dénominateur flotter ...

opérations int retour généralement int, vous devez changer l'un des numéros de operanding.

+1

Habituellement? S'ils reviennent du tout, ils vont retourner int. –

9

Essayez:

v = (float)s/(float)t; 

casting les ints à flotteurs permettra la division à virgule flottante ait lieu.

Vous n'avez vraiment besoin d'en lancer qu'un.

+0

Je ne sais pas, c'est comme si vous disiez que vous devriez utiliser des longs plutôt que des iof. –

3

Convertissez l'un des entiers en un flottant pour forcer l'opération à être effectuée avec des calculs en virgule flottante. Autrement les maths entiers sont toujours préférés. Alors:

v = (float)s/t; 
3

Vous pouvez jeter même un seul d'entre eux, mais par souci de cohérence, vous voudrez peut-être jeter explicitement à la fois si quelque chose comme v = (float) s/(float) t devrait fonctionner.

4

Pour réduire l'impact sur readabilty de code, je vous suggère:

v = 1d* s/t; 
0

Cast un des entiers/les deux de l'entier de flotter pour forcer l'opération à faire avec virgule flottante Math. Sinon, Math est toujours préféré. Alors :

1. v = (float)s/t; 
2. v = (float)s/(float)t; 
0

JLS standard

JLS 7 15.17.2. Division Operator / dit:

division entière arrondit vers 0.

C'est pourquoi 1/2 ne donne pas un flotteur.

Conversion juste un ou l'autre flotter comme dans (float)1/2 suffit, car 15.17. Multiplicative Operators dit:

promotion numérique binaire est exécutée sur les opérandes

et 5.6.2. Binary Numeric Promotion dit:

  • Si l'un ou l'autre opérande est de type double, l'autre est conv ert de doubler.
  • Dans le cas contraire, si l'un des opérandes est de type float, l'autre est converti en flotter
0

Essayez ceci:

class CalcV 
{ 
     float v; 
     float calcV(int s, int t) 
     { 
      float value1=s; 
      float value2=t; 
      v = value1/value2; 
      return v; 
     } //end calcV 
} 
Questions connexes