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

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


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.


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;

4

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

v = 1d* s/t;

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.


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.


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

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;

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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.