2009-04-20 18 views

回答

11

該問題可能是由於Double.MaxValue已轉換爲字符串的事實,並且當輸出該字符串時,並非輸出所有數字,而是將其舍入。解析這個值會溢出double。

使用Double.TryParse並隨後在出現故障時檢查字符串「1.79769313486232E + 308」上的相等性,如果需要保持字符串不變,則應該使用Double.MaxValue作爲快速解決方法。

編輯:當然,如果你不需要保持字符串的方式,使用Round Trip format specifier來產生字符串在第一位,作爲Jon describes in his answer

1

您可以嘗試double.Parse()double.TryParse()而非Convert.ToDouble(),但我不能確定你會得到更好的結果。順便提一句,您提供的字符串等於double.MaxValue,這當然是(可以包含在雙精度值中的最大值),所以這可能是您的錯誤來自何處。浮點數值類型是挑剔的,所以我會假定某種舍入正在發生並將其推到該類型的邊界之外。

您也可以嘗試decimal數據類型。你可能會有更好的運氣。

+1

,或直接使用double.MaxValue?或者對該特定字符串進行字符串測試並替換double.MaxValue,因爲它顯然是一種特殊情況。 – gbarry 2009-04-20 04:58:08

+1

小數點根本不起作用。 Decimal.MaxValue codekaizen 2009-04-20 05:16:12

-2

這個數字對於雙數來說太大了,正如例外說的那樣。你將不得不找到一個大型的庫來爲你處理,因爲在.NET庫中我沒有任何處理大量數據的知識。

21

不幸的是,這個值大於double.MaxValue,因此是個例外。

隨着codekaizen的建議,您可以對字符串進行硬編碼測試。一個更好的(IMO)替代方案,如果你是一個生產字符串首先是使用「r」格式說明符。然後,你產生的字符串將是「1.7976931348623157E + 308」來代替,然後解析正確:

string s = double.MaxValue.ToString("r"); 
double d = double.Parse(s); // No exception 

顯然,這沒有幫助,如果你沒有對數據的控制 - 但是你應該明白你在這種情況下可能會丟失數據。

1

這是我想出來的。感謝Jon Skeet和codekaizen。

private double convertToDouble(string str) 
{ 
    double dbl; 

    if (double.TryParse(str, out dbl)) 
     return dbl; 

    if (str == "1.79769313486232E+308") 
     return double.MaxValue; 

    return double.MinValue; 
} 
1

演示問題和解決方案:

var s = double.MaxValue.ToString(); 
double d; 
if (!double.TryParse(s, out d)) { 
    d = s.Equals(double.MaxValue) ? double.MaxValue : double.MinValue; 
}