2015-11-06 57 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類型。 –