为什么我不能为Double.Min和Max指定双倍相同的文字值?

Tob*_*rth 4 c# double literals

反编译源并查找Double.MinDouble.Max显示以下定义:

public const double MinValue = -1.79769313486232E+308;
public const double MaxValue = 1.79769313486232E+308;
Run Code Online (Sandbox Code Playgroud)

这与msdn页面匹配.

如果我尝试手动将此最大值分配给变量,则会出现以下错误:

Floating-point constant is outside the range of type 'double'
Run Code Online (Sandbox Code Playgroud)
double d1 = -1.79769313486232E+308; // DOESN'T COMPILE
Double d2 = 1.79769313486232E+308; // DOESN'T COMPILE
Run Code Online (Sandbox Code Playgroud)

有人能解释一下为什么会这样吗?双边界验证有问题吗?

usr*_*usr 5

这是一个已知的.NET Framework和.NET Core错误.由于Roslyn编译器可能只使用.NET Framework解析代码,因此编译器会无效地拒绝此double值.

哈罗德指出,价值是四舍五入的.但是,如果你将它四舍五入,那么它仍然无效.

double.Parse("1.79769313486231E+308")
Run Code Online (Sandbox Code Playgroud)

抛出一个OverflowException.

此GitHub问题链接到许多其他浮点解析错误.令我惊讶的是,看到这个基本框架功能有多么破碎.

  • 我的理解是Roslyn实现了自己的双解析例程,在这里:https://github.com/dotnet/roslyn/blob/fab7134296816fc80019c60b0f5bef7400cf23ea/src/Compilers/Core/Portable/RealParser.cs#L31虽然它是否共享逻辑使用基础.NET核心库我不知道.我从未在lexer的这一部分工作过.无论如何,我分享你的惊喜; 解析max double是一个明显的测试用例,这应该是开发人员在代码首次编写的那天发现的! (2认同)