2

以下のコードの出力は

package com.ajay.compoitepattern;
class Test {
        public static void main(String[] args) {
                int big = 1234567890;
                float approx = big;
                System.out.println(big - (approx));
                System.out.println(big - (int)(approx));
        }
}

このプログラムへの出力は

0.0
-46

私の質問は、拡大変換で精度が失われた場合、最初の sysout でも -46 になるはずだったのに、なぜ最初の出力が 0.0 なのですか?

4

4 に答える 4

4

float は int から減算され、ステートメント全体が float になるため、最初の出力は 0.0 です。

つまり、int big も float 値に変換されます。基本的にあなたがやっているのは (approx - approx) as(float)big = approx. です。これがゼロになる理由です。

必要な場合は、これも試してください

System.out.println(big/(approx));

との間の操作は、ステートメント全体を次のようintfloat変換します。float

于 2013-07-16T04:46:58.297 に答える
3

これは JLS §4.2.4でカバーされています。

2 項演算子のオペランドの少なくとも 1 つが浮動小数点型である場合、その演算は浮動小数点演算であり、もう一方が整数であっても同様です。

最初の例でbig - approxは、approxは であるためfloat、これは浮動小数点演算としてカウントされます。bigは に拡大され、floatapproxbig拡大されるためfloat、精度の低下は相殺され、答えはゼロになります。

2 番目の例では、 にキャストしたbig - (int) approxため、どちらのオペランドも浮動小数点型ではありません。精度の損失が存在するようになり、答えはゼロではなくなりました。approxint

于 2013-07-16T04:50:52.520 に答える
1

これを読めば理解できるかもしれません。このSO投稿も読んでください..

あなたのコードを考えてみましょう

    int big = 1234567890;     // here your int big=1234567890;
    float approx = big;
    BigDecimal bd=BigDecimal.valueOf(approx);
    System.out.println(bd);  // Now you can see int to float creates approx= 1234567936;
    System.out.println(big - (approx));     // In here big again casting to float since you are doing a operation with float, result is zero.
    System.out.println(big - (int)(approx)); // here big=1234567890 and approx= 1234567936. so difference is -46
于 2013-07-16T04:47:25.873 に答える