Comment faire en sorte que la division de 2 entiers produise un float au lieu d'un autre int?

149

Dans un autre exercice de Bruce Eckels de calcul de la vitesse, v = s / toù s et t sont des entiers. Comment faire en sorte que la division lance un flotteur?

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
Phill
la source
float v = s / t effectue la division puis transforme le résultat en un float. float v = (float) s / t lance pour flotter puis effectue la division.
Juan Carlos Iturriagagoitia

Réponses:

307

Il suffit de lancer d'abord l'un des deux opérandes en flottant.

v = (float)s / t;

La distribution a une priorité plus élevée que la division, ce qui se passe avant la division.

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

Alnitak
la source
8
Grrr, cela m'a pris environ 30 minutes jusqu'à ce que je trouve cela et que je le trouve. Si simple. : D
Rihards
Plus précisément, cette règle particulière est mentionnée ici: les opérateurs multiplicatifs , alors laissez-la ici pour référence future.
quantum
5
(Pour ceux qui rencontrent cette question plus tard, les liens indiqués sont rompus. Les nouveaux sont: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 et docs. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Steve Haley
13

Essayer:

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

La conversion des entiers en flotteurs permettra une division en virgule flottante.

Cependant, vous n'avez vraiment besoin d'en lancer qu'un.

anisoptères
la source
Je ne sais pas, c'est comme dire que vous devriez utiliser des longs à la place des ints.
Jakub Zaverka
4

Convertissez l'un des nombres entiers en flottant pour forcer l'opération à être effectuée avec des calculs en virgule flottante. Sinon, le calcul des nombres entiers est toujours préféré. Alors:

v = (float)s / t;
Jason Coco
la source
4

Pour réduire l'impact sur la lisibilité du code, je suggère:

v = 1d* s/t;
programmeur spatial
la source
3

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

Les opérations int renvoient généralement int, vous devez donc modifier l'un des numéros d'opérande.

Jhonny D. Cano -Leftware-
la source
1
Habituellement? S'ils reviennent du tout, ils vont retourner int.
Matthew Flaschen
3

Vous pouvez lancer ne serait-ce qu'un seul d'entre eux, mais par souci de cohérence, vous voudrez peut-être lancer explicitement les deux afin que quelque chose comme v = (float) s / (float) t devrait fonctionner.

Uri
la source
1

Norme JLS

JLS 7 15.17.2. Opérateur de division / dit:

La division entière arrondit vers 0. Autrement dit, le quotient produit pour les opérandes n et d qui sont des nombres entiers après la promotion numérique binaire (§5.6.2) est une valeur entière q dont la grandeur est la plus grande possible tout en satisfaisant | d · q | ≤ | n |. De plus, q est positif lorsque | n | ≥ | d | et n et d ont le même signe, mais q est négatif quand | n | ≥ | d | et n et d ont des signes opposés.

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

Il suffit de convertir l'un ou l'autre en flottant comme dans (float)1/2car 15.17. Opérateurs multiplicatifs dit:

La promotion numérique binaire est effectuée sur les opérandes

et 5.6.2. Promotion numérique binaire dit:

  • Si l'un des opérandes est de type double, l'autre est converti en double.
  • Sinon, si l'un des opérandes est de type float, l'autre est converti en float
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source
0

Transtypez l'un des nombres entiers / les deux de l'entier en float pour forcer l'opération à être effectuée avec des mathématiques à virgule flottante. Sinon, le nombre entier Math est toujours préféré. Alors:

1. v = (float)s / t;
2. v = (float)s / (float)t;
Nikhil Kumar
la source
0

Essaye ça:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
Puis-je vous aider
la source