Wie kann die Division von 2 Ints einen Float anstelle eines anderen Int erzeugen?

148

In einer anderen Übung von Bruce Eckels zur Berechnung der Geschwindigkeit, v = s / twobei s und t ganze Zahlen sind. Wie mache ich es so, dass die Division einen Schwimmer herauskurbelt?

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
quelle
float v = s / t führt eine Division durch und wandelt das Ergebnis in einen float um. float v = (float) s / t wird in float umgewandelt und führt dann eine Division durch.
Juan Carlos Iturriagagoitia

Antworten:

305

Wirf einfach zuerst einen der beiden Operanden auf einen Float.

v = (float)s / t;

Die Besetzung hat eine höhere Priorität als die Teilung, dies geschieht also vor der Teilung.

Der andere Operand wird vom Compiler automatisch in einen Gleitkommawert umgewandelt, da die Regeln besagen, dass die Operation eine Gleitkommaoperation ist, wenn einer der Operanden vom Gleitkommatyp ist, selbst wenn der andere Operand ganzzahlig ist. Java-Sprachspezifikation, §4.2.4 und §15.17

Alnitak
quelle
8
Grrr, das hat ungefähr 30 Minuten gedauert, bis ich das gefunden und herausgefunden habe. So einfach. : D
Rihards
Insbesondere wird diese spezielle Regel hier erwähnt: Multiplikative Operatoren , lassen Sie sie hier als zukünftige Referenz stehen.
Quantum
5
(Für alle, die später auf diese Frage stoßen, sind die angegebenen Links fehlerhaft. Die neuen sind: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 und docs. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Steve Haley
13

Versuchen:

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

Wenn Sie die Ints in Floats umwandeln, kann eine Gleitkommadivision stattfinden.

Sie müssen aber wirklich nur einen besetzen.

Anisoptera
quelle
Ich weiß nicht, es ist wie zu sagen, dass Sie Longs anstelle von Ints verwenden sollten.
Jakub Zaverka
4

Wirf eine der ganzen Zahlen in einen Gleitkommawert, um zu erzwingen, dass die Operation mit Gleitkomma-Mathematik ausgeführt wird. Ansonsten wird immer eine ganzzahlige Mathematik bevorzugt. So:

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

Um die Auswirkungen auf die Lesbarkeit des Codes zu verringern, würde ich Folgendes vorschlagen:

v = 1d* s/t;
Raumprogrammierer
quelle
3

Sie können den Zähler oder den Nenner in Float umwandeln ...

int-Operationen geben normalerweise int zurück, daher müssen Sie eine der Operandennummern ändern.

Jhonny D. Cano -Leftware-
quelle
1
Normalerweise? Wenn sie überhaupt zurückkehren, werden sie int zurückgeben.
Matthew Flaschen
3

Sie können auch nur einen von ihnen umwandeln, aber aus Gründen der Konsistenz möchten Sie möglicherweise beide explizit umwandeln, damit so etwas wie v = (float) s / (float) t funktioniert.

Uri
quelle
1

JLS Standard

JLS 7 15.17.2. Abteilungsbetreiber / sagt:

Die Ganzzahldivision rundet auf 0 ab. Das heißt, der Quotient, der für die Operanden n und d erzeugt wird, die nach der binären numerischen Heraufstufung Ganzzahlen sind (§5.6.2), ist ein ganzzahliger Wert q, dessen Größe so groß wie möglich ist, während | d · q | erfüllt wird ≤ | n |. Darüber hinaus ist q positiv, wenn | n | ≥ | d | und n und d haben das gleiche Vorzeichen, aber q ist negativ, wenn | n | ≥ | d | und n und d haben entgegengesetzte Vorzeichen.

Deshalb 1/2gibt es keinen Schwimmer.

Die Konvertierung von nur einem in Float wie in (float)1/2genügt, weil 15.17. Multiplikative Operatoren sagt:

An den Operanden wird eine binäre numerische Heraufstufung durchgeführt

und 5.6.2. Binary Numeric Promotion sagt:

  • Wenn einer der Operanden vom Typ double ist, wird der andere in double konvertiert.
  • Wenn einer der Operanden vom Typ float ist, wird der andere in float konvertiert
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
0

Wirf eine der ganzen Zahlen / beide der ganzen Zahl in float, um die Operation mit Gleitkomma-Mathematik zu erzwingen. Ansonsten wird immer eine ganzzahlige Mathematik bevorzugt. So:

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

Versuche dies:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
Kann ich dir helfen
quelle