我有這個字符串「1.79769313486232E + 308」,並試圖將它轉換爲一個.NET數值(double?),但我得到了下面的異常。我正在使用Convert.ToDouble()
。什麼是做這種轉換的正確方法?將「1.79769313486232E + 308」轉換爲double而不會發生OverflowException?
發生OverflowException:值是太大或太小的雙
我有這個字符串「1.79769313486232E + 308」,並試圖將它轉換爲一個.NET數值(double?),但我得到了下面的異常。我正在使用Convert.ToDouble()
。什麼是做這種轉換的正確方法?將「1.79769313486232E + 308」轉換爲double而不會發生OverflowException?
發生OverflowException:值是太大或太小的雙
該問題可能是由於Double.MaxValue
已轉換爲字符串的事實,並且當輸出該字符串時,並非輸出所有數字,而是將其舍入。解析這個值會溢出double。
使用Double.TryParse
並隨後在出現故障時檢查字符串「1.79769313486232E + 308」上的相等性,如果需要保持字符串不變,則應該使用Double.MaxValue
作爲快速解決方法。
編輯:當然,如果你不需要保持字符串的方式,使用Round Trip format specifier來產生字符串在第一位,作爲Jon describes in his answer。
您可以嘗試double.Parse()
或double.TryParse()
而非Convert.ToDouble()
,但我不能確定你會得到更好的結果。順便提一句,您提供的字符串等於double.MaxValue
,這當然是(可以包含在雙精度值中的最大值),所以這可能是您的錯誤來自何處。浮點數值類型是挑剔的,所以我會假定某種舍入正在發生並將其推到該類型的邊界之外。
您也可以嘗試decimal
數據類型。你可能會有更好的運氣。
這個數字對於雙數來說太大了,正如例外說的那樣。你將不得不找到一個大型的庫來爲你處理,因爲在.NET庫中我沒有任何處理大量數據的知識。
不幸的是,這個值大於double.MaxValue
,因此是個例外。
隨着codekaizen的建議,您可以對字符串進行硬編碼測試。一個更好的(IMO)替代方案,如果你是一個生產字符串首先是使用「r」格式說明符。然後,你產生的字符串將是「1.7976931348623157E + 308」來代替,然後解析正確:
string s = double.MaxValue.ToString("r");
double d = double.Parse(s); // No exception
顯然,這沒有幫助,如果你沒有對數據的控制 - 但是你應該明白你在這種情況下可能會丟失數據。
這是我想出來的。感謝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;
}
演示問題和解決方案:
var s = double.MaxValue.ToString();
double d;
if (!double.TryParse(s, out d)) {
d = s.Equals(double.MaxValue) ? double.MaxValue : double.MinValue;
}
,或直接使用double.MaxValue?或者對該特定字符串進行字符串測試並替換double.MaxValue,因爲它顯然是一種特殊情況。 – gbarry 2009-04-20 04:58:08
小數點根本不起作用。 Decimal.MaxValue
codekaizen
2009-04-20 05:16:12