在我的计划中,我在下一行收到FormatException
消息The value could not be parsed
:
c = BigInteger.Parse("" + Math.Pow(b, 3));
当b = 99000时发生异常,但如果我用99000手动替换b,则不会发生异常。我还用b = 99001和其他更高的值测试了它,但我没有得到错误。
答案 0 :(得分:2)
根本原因是Math.Pow
对双打而不是整数数据类型进行操作。默认情况下,Double.ToString()
仅返回15位精度,而double数据类型内部最多只能存储17位精度。
当b = 100,000时,b 3 = 1,000,000,000,000,000(16位),转换为字符串将返回结果1E+15
。 BigInteger.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));
假设你没有在循环中运行,那将会创建那些......