6

私がこのようなことをするとき

int test = 5 + 3 * (4 - 1) / 2;

私は9を取得します。これはintが切り捨てられたためだと思いました。しかし、私がこれを行うとき

float test = 5 + 3 * (4 - 1) / 2;

私も9を取得します。しかし、これを行うと

float test1 = 5;
float test2 = 4.5;
float test = test1 + test2;

テストは最終的に9.5を出力します。誰かがこれの背後にある論理を説明できますか?2番目の例で9.5を取得しないのはなぜですか?ありがとう。

4

4 に答える 4

17

2 番目の例では、結果を type の変数に割り当てfloatていますが、計算自体は最初の例とまったく同じ方法で実行されます。Java は、右辺の計算方法を決定するために宛先変数の型を調べません。特に、部分式の3 * (4 - 1) / 2結果は になり4ます。

これを修正するには、すべての整数の代わりに浮動小数点リテラルを使用できます。

float test = 5 + 3 * (4 - 1) / 2.0f;

を使用2.0fすると、算術式の浮動小数点計算がトリガーされます。

于 2012-08-26T22:43:06.340 に答える
3

の結果を5 + 3 * (4 - 1) / 2float で表しますが、実際の評価は整数の精度で行われます。つまり、9 / 2float として評価された場合に得られる 4.5 ではなく、4 が返されます。

于 2012-08-26T22:44:46.623 に答える
2

式には独自の型があります。だから始めてください:

5 + 3 * (4 - 1) / 2

各値には独自の型があります。このタイプはたまたま であるintため、これは次と同じです。

((int)5) + ((int)3) * (((int)4) - ((int)1)) / ((int)2)

int を扱っていることを明確にします。これが評価された後でのみ9、float に割り当てられます。

于 2012-08-26T23:20:50.420 に答える
0

手短に言えば、整数型は法 1 で剰余演算を行い、剰余を破棄するというものです。

test整数としてキャストするため、剰余算術は法 1 で使用されます (例: 9.5 mod 1)、int test = 5 + 3 * (4 - 1) / 2;

32 ビットまたは 64 ビットの float では、9.5 になります。ただし、 としてキャストtestしたintため、残りは破棄され、 によって参照される値testは 9 になります。

于 2012-09-02T01:21:58.420 に答える