在我的程序中,我在以下行收到一条FormatException
消息:The value could not be parsed
c = BigInteger.Parse("" + Math.Pow(b, 3));
当 b = 99000 时发生异常,但如果我手动将 b 替换为 99000,则不会发生异常。我还用 b = 99001 和其他更高的值对其进行了测试,但我没有得到错误。
在我的程序中,我在以下行收到一条FormatException
消息:The value could not be parsed
c = BigInteger.Parse("" + Math.Pow(b, 3));
当 b = 99000 时发生异常,但如果我手动将 b 替换为 99000,则不会发生异常。我还用 b = 99001 和其他更高的值对其进行了测试,但我没有得到错误。
根本原因是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
}
奇怪......这似乎对我有用,你对解析中的字符串是正确的。
BigInteger c;
long b = 9000;
c = BigInteger.Parse("" + Math.Pow(b, 3));
没有抛出错误...
至于关于 codemonkeh 的评论ToString()
,你也可以这样做
BigInteger d = new BigInteger(Math.Pow(b, 3));
假设您没有在一个循环中运行,该循环会创建一堆......