-2

これが私が試したものです:

public class LongToDoubleTest{
    public static void main(String... args) {
        System.out.println(Long.MAX_VALUE);
        System.out.println(Long.MAX_VALUE/2);
        System.out.println(Math.floor(Long.MAX_VALUE/2));
        System.out.println(new Double(Math.floor(Long.MAX_VALUE/2)).longValue());
    }
}

出力は次のとおりです。

9223372036854775807
4611686018427387903
4.6116860184273879E18
4611686018427387904

私は最初に、データを失うことなく Long.MAX_VALUE の半分を double に保つことができるかどうかを理解しようとしていました。そのため、最後の行を除くすべての行でテストを行いました。だから、私は正しく、最後の3行方不明だったようです。次に、明確にするために、最後の行を追加しました。そして、3登場しませんでしたが4。だから私の質問は、それらがどこから4現れたのか、そしてなぜそうで4はないのかということ3です。4ここでは、実際には正しくない値であるためです。PS私は の知識が非常に乏しいIEEE 754ので、私が見つけた動作は完全に正しいかもしれませんが、4ここでは明らかに間違った値です。

4

2 に答える 2

7

longすべてを正確に a として表現できるわけではないことを理解する必要がありますdouble。結局のところ、256 8 longの値があり、多くてもその数のdouble値があります (ただし、それらの多くは「非数値」値などのために予約されています)。明らかに値ではない値 (たとえば、0.5 - 最初は整数以外の値) もあるとすれば、すべての値に値が存在する可能性はあり得ないことを意味 ます。doublelongdoublelong

つまり、long表現できない値で開始し、それを に変換してからにdouble戻すlong場合、別の数値を取得することは完全に合理的です。

double数値の大きさが大きくなるにつれて、隣接する値間の絶対差が大きくなります。したがって、数値が非常に小さい場合、2 つの数値の差は非常に小さい (実際には非常に小さい) が、数値が大きくなると (たとえば、範囲を超えると) int、数値間のギャップが大きくなり、1 よりも大きくなります。したがって、隣接するdoubleLong.MAX_VALUEはかなり離れている可能性があります。つまり、複数のlong値が同じ最も近い にマップされますdouble

于 2013-07-29T18:00:03.413 に答える