如果没有OverflowException,将“1.79769313486232E + 308”转换为double?

时间:2009-04-20 04:43:13

标签: c# .net double

我有这个字符串“1.79769313486232E + 308”并且我试图将它转换为.NET数值(double?)但我得到以下异常。我正在使用Convert.ToDouble()。这种转换的正确方法是什么?

  

OverflowException:对于Double

,值太大或太小

7 个答案:

答案 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库中没有任何我知道的处理非常大的数字。