BigInteger FormatException

时间:2013-11-15 00:23:37

标签: c#

在我的计划中,我在下一行收到FormatException消息The value could not be parsed

c = BigInteger.Parse("" + Math.Pow(b, 3));

当b = 99000时发生异常,但如果我用99000手动替换b,则不会发生异常。我还用b = 99001和其他更高的值测试了它,但我没有得到错误。

2 个答案:

答案 0 :(得分:2)

根本原因是Math.Pow对双打而不是整数数据类型进行操作。默认情况下,Double.ToString()仅返回15位精度,而double数据类型内部最多只能存储17位精度。

当b = 100,000时,b 3 = 1,000,000,000,000,000(16位),转换为字符串将返回结果1E+15BigInteger.Parse只能解析整数值(可选的空格,后跟一个符号,后跟一个或多个数字),并在字符串值"1E+15"作为参数提供时抛出FormatException。

解决方案是完全避免Math.Pow,而是使用BigInteger.Pow(BigInteger, int)。这种方法避免了转换完全加倍,并且可以取代任意大整数。

通过此更改,您的代码可能类似于以下内容:

BigInteger c;
for (BigInteger b = 1; b < 1000000; b++)
{
   c = BigInteger.Pow(b, 3);
   // c stores b^3 as a BigInteger
}

答案 1 :(得分:0)

很奇怪......这似乎对我有用,你对解析中的字符串是正确的。

BigInteger c;
long b = 9000;
c = BigInteger.Parse("" + Math.Pow(b, 3));

没有抛出错误......

关于ToString()的codemonkeh评论,您也可以这样做

BigInteger d = new BigInteger(Math.Pow(b, 3));

假设你没有在循环中运行,那将会创建那些......