双重TryParse混淆

4

我在使用LinqPad时注意到了一个奇怪的问题,我在Visual Studio测试代码单元测试中得到了相同的结果。这与数字数据类型中的所有不同的TryParse有关。在这个过程中,我注意到double.TryParse的行为与其他函数略有不同。

例如:

var doubleStr = double.MinValue.ToString();
//doubleStr = -1.79769313486232E+308

double result;
var result = double.TryParse(doubleStr, out result);
//result is returning false

所有具有MinValue的其他数据类型没有这个问题:

var floatStr = float.MinValue.ToString();
//floatStr = -3.402823E+38 

float result2;
float.TryParse(floatStr, out result2);
//result = True

有人知道为什么double类型是唯一无法将其MinValue属性的字符串版本解析回实际double类型的吗?

我不太清楚这个问题的区别,也许我漏看了什么。


2
很确定这与指数符号和.ToString()有关,导致它丢失了一些数字。 - Ron Beyer
1
很有趣的是看到doubleStr和floatStr的值。 - James R.
1
将MinValue作为字符串(-1.79769313486232E+308)会失败。将最后一位小数改为1(-1.79769313486231E+308),则可以成功。可能是两者之间的某个临界点。 - Anthony Pegram
@JamesR. 更新了这些值。 - Cubicle.Jockey
1个回答

5
为了获得一个可以被确保重新解析为 double 的字符串,请使用"R"(往返)格式字符串:
double.Parse(double.MinValue.ToString("R"))

在其他格式中,由于四舍五入的原因,您得到的字符串可能会重新解析为不同的值。对于 double.MinValue 来说,情况尤其糟糕,因为它 本应 重新解析为的不同值超出了 double 的范围。因此解析失败。

谢谢。这是一个很好的发现。MSDN说,“R”格式说明符用于确保将转换为字符串的数字值被解析回相同的数字值。此格式仅支持Single、Double和BigInteger类型。 - Cubicle.Jockey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接