C# 如何将double转换为Int64

C# 如何将double转换为Int64,c#,.net,type-conversion,C#,.net,Type Conversion,我正在尝试将一个double转换为Int64,并获得一些奇怪的行为。为了测试我的问题,我尝试了以下代码: double temporary = Int64.MaxValue; Int64 tem = Convert.ToInt64(temporary); 在将double转换为Int64时,仍然会出现溢出异常。这是虫子吗?还是有什么我不明白的地方?问题的关键在于,并非所有实数都可以用有限的浮点数据类型表示。特别是,有64位整数值不能精确表示为双精度浮点值 的值为9223372036854775

我正在尝试将一个double转换为Int64,并获得一些奇怪的行为。为了测试我的问题,我尝试了以下代码:

double temporary = Int64.MaxValue;
Int64 tem = Convert.ToInt64(temporary);

在将double转换为Int64时,仍然会出现溢出异常。这是虫子吗?还是有什么我不明白的地方?

问题的关键在于,并非所有实数都可以用有限的浮点数据类型表示。特别是,有64位整数值不能精确表示为双精度浮点值

的值为
9223372036854775807
。与此最接近的双精度值为。那么什么时候

double temporary = Int64.MaxValue;
执行时,分配给
临时
的值实际上是
9223372036854775808.0


当您尝试将此双精度值转换为
Int64
时,会发生溢出,因为该值超过
Int64。MaxValue

A
double
无法准确表示
Int64.MaxValue
,因此它会被四舍五入。由于
long
不能表示向上舍入的值,因此您会得到异常。

在哪一行得到异常?问题可能是第一行,而不是第二行?双精度可以存储15个有效数字。Int64.MaxValue有19位数字。所以double只包含MaxValue的近似值。当你试图回去的时候,它被包围了。永远不要写这样的代码。你自己就不能调试吗?只需查看
temporary
中的值,就会发现它大于
Int64
的最大值。的文档特别指出将发生溢出异常。下次请阅读文档。@tnw调试器删除了两个数字(08不可见)并放入科学符号。我确信有很多方法可以配置调试器,但这要快得多。我很好奇。如果我尝试
temporary=temporary-1仍然会引发异常。@当然是Steve。那是因为
temporary-1==temporary
;-)想想看。@Steve然后自己试试看。“这将花费你们几秒钟的时间。”大卫·费弗南谢谢你们的回答。这个链接帮助很大。我必须使用9223372036854775295,而不是实际的最大值。是的,值之间的间隔非常远!