将long转换为double和back时的值更改

Mat*_*yel 0 java casting type-conversion

给出以下代码:

long l = 1234567890123;
double d = (double) l;
Run Code Online (Sandbox Code Playgroud)

以下表达式保证是真的吗?

l == (long) d
Run Code Online (Sandbox Code Playgroud)

我应该不这么认为,因为随着数字的增大,两个双精度数之间的差距会超过1,因此转换回产生不同的长值.如果转换不采用大于long值的值,则可能也会更早发生.

对此有明确的答案吗?

Jon*_*eet 5

不,绝对不是.有很多long值不能完全代表double.实际上,必须是这种情况,因为两种类型都以64位表示,并且显然有很多double值无法表示long(例如0.5)

简单的例子(Java然后是C#):

// Java
class Test {
    public static void main(String[] args) {
        long x = Long.MAX_VALUE - 1;
        double d = x;
        long y = (long) d;
        System.out.println(x == y);
    }
}

// C#
using System;

class Test
{
    static void Main()
    {
        long x = long.MaxValue;
        double d = x;
        long y = (long) d;
        Console.WriteLine(x == y);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在做这件事时发现了一些非常奇怪的东西,虽然...在C#中,long.MaxValue"工作"在印刷假的方面......而在Java中,我不得不使用Long.MAX_VALUE - 1.我的猜测是,这是由于某些情况下的一些内联和80位浮点操作...但它仍然很奇怪:)