在 Java 中混淆 long 和 double 行为

Confusing long vs double behavior in Java

这是一个小方法,它显示类型转换为 double 的作品,但普通 longs 没有。

public void test() {
    long s = Long.MIN_VALUE;
    long e = Long.MAX_VALUE;
    System.out.println((double)e-(double)s);
    System.out.println(e-s);
    System.out.println(Double.SIZE);
    System.out.println(Long.SIZE);
}

上述方法的输出是:

1.8446744073709552E19
-1
64
64

所以问题是,如果 double 和 long 都是 Java 中的 64 位数字,那么为什么类型转换为 double 会给出更好的结果?

后续问题:

在Java中,我想将long的整个范围(从-2^63到2^63-1)分成10,000个相等的范围。我怎样才能做同样的事情? (一些代码真的很有帮助)。

Long.MAX_VALUE - Long.MIN_VALUE高于Long.MAX_VALUE,这就是为什么这个减法会导致数值溢出的原因。因此你得不到正确的结果。

double类型表示的数字范围更广,但精度较低(因为一些位表示数字的数字,而其余位表示指数)。

longdouble 类型都使用 64 位来表示数字这一事实并不意味着它们都支持相同的值范围。他们没有。

一个double可以表示的最大值是1.7976931348623157E308,而一个long可以表示的最大值是2^63-1,即小得多 (9.223372036854776E18).