2つの整数の除算で別の整数の代わりに浮動小数点を生成する方法は?


149

速度を計算する別のブルース・エッケルズの演習ではv = s / t、sとtは整数です。ディビジョンがフロートをクランクアウトするようにするにはどうすればよいですか?

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は除算を実行し、結果をfloatに変換します。float v =(float)s / tはfloatにキャストしてから除算を実行します。
Juan Carlos Iturriagagoitia

回答:


307

最初に2つのオペランドの1つを浮動小数点数にキャストします。

v = (float)s / t;

キャストは部門よりも優先順位が高いため、部門の前に発生します。

ルールは、どちらかのオペランドが浮動小数点型である場合、演算は浮動小数点演算であり、他のオペランドが整数であっても、ルールはコンパイラによって浮動小数点に効果的に自動的にキャストされます。 Java言語仕様、§4.2.4および§15.17


8
Grrr、これを見つけて理解するまでに約30分かかりました。とても簡単。:D
Rihards 2011

具体的には、この特定のルールがここで言及されています乗法演算子は、それが将来の参考のためにここに立ってみましょう。
量子

5
(後でこの質問に出くわす人のために、与えられたリンクは壊れています。新しいリンクは:docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4docsです。 oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17
スティーブ・ヘイリー

13

試してください:

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

intをfloatにキャストすると、浮動小数点除算を実行できます。

ただし、実際にキャストする必要があるのは1つだけです。


わからないけど、iof intの代わりにlongを使うべきだと言っているようなものです。
Jakub Zaverka 2012

4

整数の1つを浮動小数点にキャストして、浮動小数点演算で演算を強制的に実行します。それ以外の場合は常に整数演算が優先されます。そう:

v = (float)s / t;


3

分子または分母を浮動小数点数にキャストできます...

int演算は通常intを返すため、オペランドの数値の1つを変更する必要があります。


1
通常?彼らが戻る場合は、intを返します。
Matthew Flaschen

3

どちらか一方だけをキャストすることもできますが、一貫性を保つために両方を明示的にキャストしたい場合があるので、v =(float)s /(float)tのように機能します。


1

JLS標準

JLS 7 15.17.2。部門オペレーター/言う:

整数除算は0に向かって丸めます。つまり、2進数の数値昇格(§5.6.2)後に整数であるオペランドnおよびdに対して生成された商は、| d・q |を満たしながら、大きさが可能な限り大きい整数値qです。≤| n |。さらに、| n |の場合、qは正です。≥| d | およびnとdは同じ符号を持っていますが、| n |の場合、qは負です。≥| d | nとdの符号は逆です。

これが1/2フロートを与えない理由です。

15.17(float)1/2から、どちらか一方のみを浮動小数点数に変換するだけで十分です。乗法演算子は言う:

2進数の数値昇格がオペランドで実行されます

および5.6.2。バイナリ数値プロモーションは言う:

  • どちらかのオペランドがdouble型の場合、もう一方はdoubleに変換されます。
  • それ以外の場合、一方のオペランドがfloat型の場合、もう一方はfloatに変換されます

0

整数のいずれか/両方を浮動小数点にキャストして、演算を浮動小数点演算で強制的に実行します。それ以外の場合は常に整数演算が推奨されます。そう:

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

0

これを試して:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.