Long.MaxValue
的值是9,223,372,036,854,775,807
.当转换为单个精度值时,变为9.223372E18.然而,演员们回到了朗投出了System.OverflowException
分.尽管Single中的值实际上小于Long的可能最大值.手表窗口中的实验表明,实际上
8.070450532247929344e18
是可以安全地ctype为Long的最大双精度值.在观看窗口中try 此操作:
CType(8.070450532247929344000001e18, Long)
进一步
8.070450807125836288e18
是最大的双精度值,在转换为单精度后,将安全地转换为Long,使用监视窗口中的以下陈述:
CType(CType(8.0704508071258362880000001e18, Single), Long)
这似乎是非常奇怪的行为.
为什么?
Edit: Further Experimentation
上述实验使用观看窗口和CTypes.另一个实验得到了另一个答案:
Dim d As Long = 200000000000
Dim delta As Long = d / 2
Dim c As Long
Dim a As Single
Dim b As Long
While delta > 0
c = Long.MaxValue - d
a = c
Try
b = a
delta = delta \ 2
d = d - delta
Catch ex As Exception
d = d + delta
End Try
End While
上面的代码生成可以来回转换的最大Long是:
9,223,371,761,976,868,860
或
Long.MaxValue - 274,877,906,947