这是一个小方法,显示类型转换为 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
类型表示的数字范围更广,但精度较低(因为一些位表示数字的数字,而其余位表示指数)。
long
和 double
类型都使用 64 位来表示数字这一事实并不意味着它们都支持相同的值范围。他们没有。
double
可以表示的最大值是1.7976931348623157E308
,而long
可以表示的最大值是2^63-1
,它要小得多 (9.223372036854776E18
)。
关于java - 混淆 Java 中的 long 与 double 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43626127/