2013-08-11 17 views
7
長いとダブル

間の型キャストが、私は今、このコード取得予期しない結果

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していますか?

答えて

5

変数ldは、異なるタイプを持っているので、表現long == doubledouble ...

P.S.にlongをキャストlは悪い変数名imhoです。なぜなら、コード全体を見ると、1のように見えるからです。

2

なぜリットルの==はtrueを返しdはありません;

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

これはJLS - Section 5.6.2で指定されている:一方のオペランドである場合

  • :プリミティブ変換(5.1.2)を拡幅

    は、以下の規則によって指定される一方または両方のオペランドを変換するために適用されますdouble型のもの、double型のものに変換されます。

ないすべてlong値が一意double値で表すことができるので、あなたは、doubleに異なる結果を見ています。したがって、1つのlong値に対して複数のdouble値を持つ可能性があります。 longからdoubleに変換中に精度が低下する可能性があります。を2倍に

浮遊するintまたは長い値の拡大変換、またはロング値の、精度の損失をもたらすことができる - すなわち、結果が失われる可能性があり:JLS Section 5.1.2から

値の最下位ビットのいくつか

2

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

double型のほうが有意ではない(実際の桁を格納するために53ビットの仮数を持ち、残りのビットは符号と指数に使用されるため)すべて64ビット)。すべてのlong値を一意のdouble値として表すことはできません。

2

92233720368547758079.223372036854776E18

等しい精度922337203685477の最初の15桁に注意同じです。最初の数字の5807の残りは、E18を追加できるように6に丸められます。科学的表記法で

9223372036854775807である:

9.223372036854775807 x 10^18 == 9.223372036854775807E18 

の比較:それはで表示されるよりも値がより高い精度で記憶される

9.223372036854775807E18 
9.223372036854776E18 

、証明のためにこれを参照してください。

long l; 
    double d; 
    l = Long.MAX_VALUE;// The largest number a long can hold. 
    d = l; //This is implicitly cast to (double) 
    System.out.println("long: " + l); 
    System.out.println("double: " + d); 
    System.out.println("double back to long: " + (long) d); 

長い:9223372036854775807
ダブル:9.223372036854776E18
ダブルバックロングへ:9223372036854775807

山車とダブルスが格納されている方法の第二の問題もあります。整数型(byte、short、int、long)は正確ですが、floatとdoubleはIEEE754の仮数 - 指数スタイルを使用しています。 http://en.wikipedia.org/wiki/IEEE_754-1985