2015-11-06 60 views
4

所以我在LinqPad左右徘徊,注意到一些奇怪的东西,我在Visual Studio测试代码单元测试中得到了相同的结果。double TryParse confusion

我正在玩数字数据类型的所有不同的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 

任何身体知道为什么双是唯一一个假解析的字符串版本它的MinValue属性返回到实际的双精度值?

我不明白这是为什么不同。也许我错过了一些东西。

+2

很确定这与使用.ToString()的指数表示法会导致它丢失一些数字有关。 –

+1

看到doubleStr和floatStr值会很有意思。 –

+1

MinValue作为字符串(-1.79769313486232E + 308)失败。将最后一位小数撞到1(-1.79769313486231E + 308)并成功。可能是两者之间的一些突破点。 –

回答

5

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

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

在其他格式,你得到的字符串一般可以重新解析由于四舍五入而导致不同的值。随着double.MinValue,这变得特别糟糕,因为重新解析为的不同值在double的范围之外。因此解析失败。

+0

谢谢。这是一个很好的发现。 MSDN表示往返(“R”)格式说明符用于确保转换为字符串的数值将被解析回相同的数值。该格式仅支持Single,Double和BigInteger类型。 –