我有这个字符串“1.79769313486232E + 308”并且我试图将它转换为.NET数值(double?)但我得到以下异常。我正在使用Convert.ToDouble()
。这种转换的正确方法是什么?
OverflowException:对于Double
,值太大或太小
答案 0 :(得分:21)
不幸的是,这个值大于double.MaxValue
,因此是例外。
正如codekaizen建议的那样,你可以对字符串的测试进行硬编码。如果您是首先生成字符串,那么更好的(IMO)替代方法是使用“r”格式说明符。然后你生成的字符串将改为“1.7976931348623157E + 308”,然后正确解析:
string s = double.MaxValue.ToString("r");
double d = double.Parse(s); // No exception
如果您无法控制数据,显然没有任何帮助 - 但是您应该了解在这种情况下您可能会丢失数据。
答案 1 :(得分:11)
问题可能是由于Double.MaxValue
被转换为字符串这一事实,并且当输出字符串时,并非所有数字都被输出,而是被舍入。解析这个值会溢出双倍。
使用Double.TryParse
并随后检查字符串“1.79769313486232E + 308”的相等性,如果失败并替换Double.MaxValue
应该是一个快速的解决方法,如果你需要保持字符串的方式是
编辑:当然,如果您不需要保持字符串的方式,请使用Round Trip format specifier首先生成字符串,Jon describes in his answer。
答案 2 :(得分:1)
您可以尝试double.Parse()
或double.TryParse()
而不是Convert.ToDouble()
,但我不确定您会获得更好的结果。顺便提一下,您提供的字符串等于double.MaxValue
,这当然是双精度中可以包含的最大值,因此很可能是您的错误发生的地方。浮点数字类型很挑剔,所以我假设正在进行某种舍入并将其推到该类型的边界之外。
您还可以尝试decimal
数据类型。你可能会有更好的运气。
答案 3 :(得分: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;
}
答案 4 :(得分:1)
展示问题和解决方案:
var s = double.MaxValue.ToString();
double d;
if (!double.TryParse(s, out d)) {
d = s.Equals(double.MaxValue) ? double.MaxValue : double.MinValue;
}
答案 5 :(得分:-1)
我有时会得到相同的数字。这是我的解决方法。
var str =“ 1.79769313486232E + 308”; var dbl = double.Parse(str.Replace(“ E +”,“”));
答案 6 :(得分:-2)
这个数字对于双数来说太大了,正如例外情况所说的那样。您将不得不找到一个大型库来为您处理,因为在.Net库中没有任何我知道的处理非常大的数字。