8

我有这个代码

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

现在,打印的两个数字显然不等于,那么为什么l == d返回true

4

5 回答 5

5

变量ld具有不同的类型,因此表达式long == double将其转换longdouble...

PSl是一个糟糕的变量名称恕我直言,因为它看起来很像1浏览代码时。

于 2013-08-11T14:59:23.190 回答
2

9223372036854775807并且9.223372036854776E18 是平等的

注意前 15 位精度922337203685477是相同的。第一个数字的其余部分5807四舍五入为 6,以便E18可以附加。

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

于 2013-09-30T12:12:54.043 回答
2

l == d返回truebecausel自动提升为double,然后将结果(与 相同d)与d.

如果您有兴趣,可以阅读 JLS 中的促销规则:

于 2013-08-11T15:00:38.960 回答
2

那么为什么 l == d 返回 true;

因为long被转换为double之前的比较。因此结果是正确的。

这在JLS - 第 5.6.2 节中指定:

加宽原语转换(第 5.1.2 节)适用于转换以下规则指定的一个或两个操作数:

  • 如果任一操作数是 double 类型,则另一个操作数将转换为 double。

您看到 的结果不同double,因为并非所有long值都可以用唯一double值表示。因此,对于单个 long 值,您可能有许多 double 值。long从 转换为时可能会损失精度double

JLS 第 5.1.2 节

将 int 或 long 值转换为 float 或将long 值转换为 double可能会导致精度损失 - 也就是说,结果可能会丢失值的某些最低有效位。

于 2013-08-11T15:00:45.790 回答
2

为了比较两个值,它们必须具有相同的类型。这里 long 值被隐式转换为 double 类型,并且转换的结果给出了与赋值相同的值。

这些值首先是不同的,因为 double 类型的“重要性”(它有一个 53 位尾数用于存储实际数字;其余位用于符号和指数)比 long(所有 64 位) . 并非所有 long 值都可以表示为唯一的 double 值。

于 2013-08-11T15:02:08.500 回答