1

在我的程序中,我在以下行收到一条FormatException消息:The value could not be parsed

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

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

4

2 回答 2

2

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

当 b=100,000 时,b 3 = 1,000,000,000,000,000(16 位),转换为字符串将返回结果为1E+15. BigInteger.Parse只能解析整数值(可选空格,后跟一个符号,后跟 1 个或多个数字),并且当字符串值"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
}
于 2013-11-15T01:56:11.857 回答
0

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

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

没有抛出错误...

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

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

假设您没有在一个循环中运行,该循环会创建一堆......

于 2013-11-15T00:41:07.537 回答