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值的值,则可能也会更早发生.
对此有明确的答案吗?
不,绝对不是.有很多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位浮点操作...但它仍然很奇怪:)
| 归档时间: |
|
| 查看次数: |
1648 次 |
| 最近记录: |