14

(360 / 24) / 60 を計算しようとしています。0.25 を取得する必要があるときに、答え 0.0 を取得し続けます。

つまり、360 を 24 で割り、その結果を 60 で割りたいのです。

public class Divide {

    public static void main(String[] args){
      float div = ((360 / 24) / 60);
      System.out.println(div);

    }
}

これは出力します:

0.0

何故ですか?私は本当に愚かなことをしていますか、それともこれには正当な理由がありますか

4

3 に答える 3

30

演算のオペランドはどれも浮動小数点数ではないため、すべて整数演算で実行されてから浮動小数点数変換されます。適切なオペランドの型を float に変更すると、問題なく動作します。

float div = ((360 / 24f) / 60); // div is now 0.25

60 だけを float に変更すると、360 / 24 が整数演算として実行されることに注意してください。基本的には、算術演算が希望どおりに実行されていることを確認する必要があります。

于 2010-03-19T07:38:15.670 に答える
24

あなたは実際に整数除算を行っています(JLS 15.17.2)。

float div = ((360 / 24) / 60);
float div = (float) ((360 / 24) / 60);
float div = (float) (15 / 60);
float div = (float) (0);
float div = 0F;

浮動小数点除算を行うには、少なくとも 1 つのオペランドが浮動小数点数値型である必要があります。

float div = ((360F / 24) / 60);
float div = 15F / 60;
float div = 0.25F;

doubleヒント: 精度が重要な場合は、 に変換する前に、 でできるだけ多くの計算を行う必要がありますfloat。実際、プロファイリングで絶対に が必要floatであることが示されない限り、常に を優先する必要がありますdouble

    float f;

    f = (1E-17F * 1E-17F);
    System.out.println(f); // prints "9.999999E-35"

    f = (float) (1E-17D * 1E-17D);
    System.out.println(f); // prints "1.0E-34"
于 2010-03-19T07:42:20.183 に答える
2

あなたの主な方法では、

public static void main(String[] args){
      float div = ((360 / 24) / 60);
      System.out.println(div);
}

360、24、および60はすべて整数値であることに注意してください。そのため、奇妙な値が得られます。

360/24-> 15(完全に細かい)
15/60-> 0.4(浮動小数点)

残念ながら、浮動小数点数は切り捨てられるため、次のようになります。

-> 0 (integer value)

次に、浮動小数点変数に0を割り当てることにより、0を浮動小数点値0.0に変更します。したがって、結果。

それらを分割する場合は、浮動小数点値に変更する必要があります。

正しいコードは次のようになります。

public static void main(String[] args){
      float div = ((360.0 / 24.0) / 60.0);
      System.out.println(div);
}
于 2012-06-06T04:23:27.630 に答える