Long.MaxValue 从 Single 转换为 Long 导致溢出异常

问题描述 投票:0回答:1

Long.MaxValue
的值为
9,223,372,036,854,775,807
。当转换为单精度值时,变为 9.223372E18。然而,转换回 Long 会抛出
System.OverflowException
。尽管 Single 中的值实际上小于 long 的可能最大值。观察窗口中的实验表明,实际上该值

8.070450532247929344e18

是可以安全地转换为 Long 的最大双精度值。进一步

8.070450807125836288e18

是最大的双精度值,转换为单精度后,将安全地转换为 Long。

这似乎是非常奇怪的行为。

为什么?

.net type-conversion
1个回答
0
投票

Long.MaxValue
等于 263 − 1。当您将此值转换为
Single
时,结果等于 263;这是最接近原始值的
Single
,由于
Single
无法保留所有原始数字,因此差值为 1。由于 263 超过
Long.MaxValue
,因此尝试将其转换回
Long
会引发 OverflowException。

© www.soinside.com 2019 - 2024. All rights reserved.