11

CASE2 のようないくつかの計算をコーディングしました (実際に行ったことの非常に単純化された例を以下にコピーしました)、悪い結果が得られました。CASE1 のようにコードをリファクタリングし、正常に動作しました。CASE 2 に暗黙のキャストがあることは知っていますが、完全な理由はわかりません。以下で正確に何が起こっているのか、誰でも説明できますか?

  //CASE 1, result 5.5
    double auxMedia = (5 + 6);
    auxMedia = auxMedia / 2;

    //CASE 2, result 5.0
    double auxMedia1 = (5 + 6) / 2;

    //CASE 3, result 5.5
    double auxMedia3 = (5.0 + 6.0) / 2.0;

    //CASE 4, result 5.5
    double auxMedia4 = (5 + 6) / 2.0;

私の推測では、CASE2 の /2 は (5 + 6) を int にキャストし、除算を 5 に丸めてから、再度 double にキャストして 5.0 に変換しています。

CASE3 と CASE 4 も問題を修正します。

4

4 に答える 4

13
  1. 5+6は整数11です。次に、これを(割り当てで)2倍にキャストし、2で割ります。5.5
  2. 5+6は整数11です。整数演算では整数11/2= 5であり、これを(割り当てで)doubleにキャストします。
  3. 5.0+6.0は2倍の11.0です。ダブル2.0で割るとダブル5.5になります
  4. 5+6は整数11です。除算のために11.0を2倍にする暗黙のキャストがあり、次に2.0を2倍にすると、5.5が2倍になります。
于 2010-03-31T19:00:21.397 に答える
5

Marc の (正しい) 回答を少し拡張すると、整数は整数として解釈されますが、小数点のある数値は double として解釈されます。整数をリテラル double として宣言するには、「D」を追加します。

        //CASE 2b, result 5.5
        double auxMedia2b = (5D + 6D) / 2;
于 2010-03-31T19:08:06.013 に答える
1
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;

(5 + 6)演算の結果は整数です。両方のオペランドが整数型であるためです。次に、コンパイラは11/2を実行します。ここで、両方のオペランドも整数です。最後の除算の結果は明らかに5です。これは整数の除算であるためです(適切な英語の単語がわかりません)。

于 2010-03-31T19:02:37.710 に答える
1

あなたは正しいです。CASE 2は、割り当てが行われるまで整数演算を使用します。明示的なキャストを作成して問題を修正することもできます。

double auxMedia1 = ((double) (5 + 6)) / 2;
于 2010-03-31T19:04:25.880 に答える