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

推荐答案

当转换为单个精度值时,Long.MaxValue将变成9.223372E18,这小于Long的可能最大值.

尽管9.223372E18是结果的默认字符串表示,但这具有误导性.确切的结果是not 9.223372 x 1018,而是263 = 9,223,372,036,854,775,808,这是最接近原始值263 - 1的Single.(1的差异是由于Single无法准确代表原始值.)

由于263超过Long.MaxValue,因此试图将其转换回Long会引发OverFlowExcellent.

What is the largest Long that can be represented exactly by a Single?

我们想要找到L = 2e x s 263的最大可能值,其中整指数e满足-126 <e <127,有效数s =b0

  • 如果e等于63,那么L等于263,这就太大了.所以e = 62.
  • 最大可能的s是(1.11. 1

因此,L = 262 x

What is the largest Long that can be converted to a Single and back to a Long without overflowing?

答案ML(从上开始)和Long.MaxValue的中点:

M =

LM之间的任何Long转换为Single,结果为L:

Dim a As Long = 9223371761976868863
Dim b As Single = a
Dim c As Long = CType(b, Long)
Console.WriteLine(c) ' Output: 9223371487098961920

M + 1和Long.MaxValue之间的任何Long转换为Single,结果为263,超过Long.MaxValue.

Why does CType(8.07045053224793E+18, Long) fail to compile?

问得好该数字小于Long.MaxValue,等效的C#express (long)8.07045053224793E+18已成功编译.因此,这似乎是VB.NET的编译时转换逻辑中的一个错误.相比之下,运行时转换的行为符合预期:

Dim a = 8.07045053224793E+18
Dim b As Long = CType(a, Long)
Console.WriteLine(b) ' Output: 8070450532247929856

.net相关问答推荐

API响应返回null错误. NET MAUI

从没有流的EventStore中读取流不存在异常

DotNet COM初始化问题

ECS服务无法从Cognito获取配置

与 Datagrid 的 SelectedItem 链接时的 WPF RadioButton 绑定问题

Silverlight 与 Flex

将双精度转换为带有 N 个小数的字符串,点作为小数分隔符,并且没有千位分隔符

为什么 LINQ .Where(predicate).First() 比 .First(predicate) 快?

如何将 NuGet 与 Visual C# Express 一起使用?

如何让 .NET 的 Path.Combine 将正斜杠转换为反斜杠?

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") 返回上午时间而不是下午时间?

从 C# 中的接口继承 XML 注释

Visual Studio 2017 和 2019 突出显示滚动条中所选单词的出现

等待 Async Void 方法调用以进行单元测试

如何获得 Bin 路径?

.NET 高级别的 .NET 4.0 和 .NET 4.5 的区别

如何将 Excel 序列日期编号转换为 .NET DateTime?

是否可以判断对象是否已附加到实体框架中的数据上下文?

Roslyn 编译代码失败

Dictionary.Add 与 Dictionary[key]=value 的区别