我正在尝试将双精度转换为Int64并获得一些奇怪的行为。为了测试我的问题,我尝试了以下代码:
double temporary = Int64.MaxValue;
Int64 tem = Convert.ToInt64(temporary);
将double转换为Int64时,我仍然会遇到溢出异常。这是一个错误吗?或者有什么我不理解的东西?
答案 0 :(得分:7)
关键在于并非所有实数都可以用有限浮点数据类型表示。特别是,有64位整数值没有精确表示为双精度浮点值。
Int64.MaxValue
的值为9,223,372,036,854,775,807
。与此最接近的双精度值是9,223,372,036,854,775,808
。所以当
double temporary = Int64.MaxValue;
已执行,分配给temporary
的值实际为9,223,372,036,854,775,808.0
。
当您尝试将此双精度值转换为Int64
时,会发生溢出,因为该值超出Int64.MaxValue
。
答案 1 :(得分:2)
double
无法准确代表Int64.MaxValue
,因此它会被四舍五入。由于long
无法表示向上舍入的值,因此您将获得例外。