Long.MaxValue
的值为9,223,372,036,854,775,807
。当转换为单精度值时,变为 9.223372E18。然而,转换回 Long 会抛出 System.OverflowException
。尽管 Single 中的值实际上小于 long 的可能最大值。观察窗口中的实验表明,实际上该值
8.070450532247929344e18
是可以安全地转换为 Long 的最大双精度值。进一步
8.070450807125836288e18
是最大的双精度值,转换为单精度后,将安全地转换为 Long。
这似乎是非常奇怪的行为。
为什么?
Long.MaxValue
等于 263 − 1。当您将此值转换为 Single
时,结果等于 263;这是最接近原始值的 Single
,由于 Single
无法保留所有原始数字,因此差值为 1。由于 263 超过 Long.MaxValue
,因此尝试将其转换回 Long
会引发 OverflowException。