8

私はこのコードを持っています

public class LimitTest{
    public static void main(String[] args){
        long l;
        double d;
        l = 9223372036854775807L;// The largest number a long can hold.
        d = l;
        System.out.println(l);
        System.out.println(d);
        System.out.println(l == d);
    }
}

さて、それが生成する結果はちょっと予想外ですが、繰り返しますが、私は型変換の経験があまりありません.

出力

9223372036854775807
9.223372036854776E18
true

ここで、出力された 2 つの数値は明らかにNOT EQUALであるのに、なぜ がl == d返されるのtrueでしょうか?

4

5 に答える 5

5

変数ldは型が異なるため、式はを...にlong == doubleキャストします。longdouble

PSlは、コードをざっと見たときによく似ているため、悪い変数名1です。

于 2013-08-11T14:59:23.190 に答える
2

l == dは に自動的に昇格され、結果 ( と同じ) がと比較されるtrueため、が返されます。ldoubledd

興味がある場合は、JLS のプロモーション ルールを参照してください。

于 2013-08-11T15:00:38.960 に答える
2

では、なぜ l == d は true を返すのでしょうか。

は比較前にlong変換されるためです。doubleしたがって、結果は真です。

これは、JLS - セクション 5.6.2で指定されています。

拡張プリミティブ変換 (§5.1.2) は、次の規則で指定されているように、一方または両方のオペランドを変換するために適用されます。

  • いずれかのオペランドが double 型の場合、もう一方は double に変換されます。

doubleすべてのlong値を一意の値で表すことができるわけではないため、 の結果が異なりdoubleます。そのため、単一の long 値に対して多数の double 値が存在する可能性があります。longからへの変換中に精度が失われる可能性がありdoubleます。

JLS セクション 5.1.2から:

int または long 値を float に、またはlong 値を doubleに拡大変換すると、精度が失われる可能性があります。つまり、結果は値の最下位ビットの一部を失う可能性があります。

于 2013-08-11T15:00:45.790 に答える
2

2 つの値を比較するには、同じ型でなければなりません。ここで、long 値は暗黙的に double 型に変換され、変換の結果は代入と同じ値になります。

double 型は long (すべて 64 ビット) よりも「有意性」が低い (実際の数字を格納するための 53 ビットの仮数があり、残りのビットは符号と指数に使用される) ため、値はそもそも異なります。 . すべての long 値を一意の double 値として表すことができるわけではありません。

于 2013-08-11T15:02:08.500 に答える