【问题标题】:double TryParse confusion双重 TryParse 混淆
【发布时间】:2015-11-06 21:49:29
【问题描述】:

所以我在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 的 false 吗?

我不明白为什么这会有所不同。也许我错过了什么。

【问题讨论】:

  • 很确定这与 .ToString() 的指数符号有关,导致它丢失一些数字。
  • 看看 doubleStr 和 floatStr 值会很有趣。
  • MinValue 作为字符串 (-1.79769313486232E+308) 失败。将最后一个小数点改为 1 (-1.79769313486231E+308) 并成功。可能是介于两者之间的某个转折点。
  • @JamesR。用这些值更新。

标签: c# .net double visual-studio-2015 linqpad


【解决方案1】:

要获得一个肯定可以重新解析为double 的字符串,请使用"R"(往返)格式字符串:

double.Parse(double.MinValue.ToString("R"))

在其他格式中,由于舍入,您得到的字符串通常可能会重新解析为不同的值。对于double.MinValue,情况会变得更糟,因为它重新解析为的不同值超出了double 的范围。因此解析失败。

【讨论】:

  • 谢谢。这是一个很好的发现。 MSDN 说往返(“R”)格式说明符用于确保转换为字符串的数值将被解析回相同的数值。仅 Single、Double 和 BigInteger 类型支持此格式。
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 2023-03-28
  • 2016-11-08
  • 2016-06-28
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多