在java中将Long转换为double,我发现了一些差异

dhb*_*lah -2 java floating-point

这是我试过的:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

9223372036854775807
4611686018427387903
4.6116860184273879E18
4611686018427387904
Run Code Online (Sandbox Code Playgroud)

我最初想弄清楚,是否有可能将Long.MAX_VALUE的一半保持在双倍而不会丢失数据,所以我对所有这些行进行了测试,除了最后一行.所以看来我是对的,最后一次3失踪了.然后,为了澄清它,我添加了最后一行.并没有3出现但是4.所以我的问题是,从那些4出现的地方以及它为什么4而不是3.因为4这里实际上是一个不正确的值.PS我的知识很差IEEE 754,所以我发现的行为绝对是正确的,但这4显然是错误的价值.

Jon*_*eet 7

您需要了解并非每个long都可以完全表示为double- 毕竟,有256个8 long值,并且最多有很多double值(尽管很多值都保留用于"非数字"值等).鉴于 存在double明显不是long值的值(例如,0.5 - 任何非整数,对于开始),这意味着不可能存在double每个long值的值.

这意味着如果你从一个long无法表示的值开始,将其转换为a double然后再转换为a ,则返回long不同的数字是完全合理的.

相邻double值之间的绝对差值随着数字的大小变大而增加.因此,当数字非常小时,两个数字之间的差异非常小(确实非常小) - 但是当数字变大时 - 例如int在数字范围之上- 数字之间的差距变得更大......甚至比1更大.因此,邻近的相邻doubleLong.MAX_VALUE可以相隔很远.这意味着几个long值将映射到最近的值double.