[英](int) Math.Pow(10, 0) returning zero rather than one
我试图反转整数,由于某种原因,我收到一个运行时错误消息,提示“ System.DivideByZeroException:试图除以零。” 弄清楚Math.Pow返回double ,为什么不将转换为int的结果保持为“ 1”。 从10到0为1,即使包含任何舍入,从1到1的转换仍应为1。 有人对此有很好的解释吗?
if (x > 0)
{
var i = 0;
while (x > 0)
{
int endDig = x % (10 * ((int)Math.Pow(10, i)));
myNum += endDig.ToString();
i += 1;
}
int newNum = Int32.Parse(myNum);
return newNum;
}
此处被零除的原因与将Math.Pow(x, 0)
强制Math.Pow(x, 0)
为int时的截断结果并不真正相关。 Math.Pow(x, 0)
将始终返回1,并将其强制转换为int将给您1。原因是整数溢出。 例如考虑:
var pow = (int)Math.Pow(10, 10);
10 ^ 10不适合int大小,因此它将溢出(多次),并且变量pow
将具有值-2147483648
。 当您将其乘以10时,它再次溢出,结果为0。这时,您将得到除以零的异常。
为了避免出现这种奇怪的结果,您可能需要进行算术运算,以免在检查的上下文中导致溢出:
checked {
var pow = (int) Math.Pow(10,10);
// throws overflow exception so you can fix your buggy code early
}
当然,到那时,您已经意识到,将数字求反的算法不是一个好方法,因此请参考另一种答案以寻求更好的方法。
您遇到了基于计算机的算术限制。 (另一个答案显示了我在以前版本的答案中不正确的细节。)要完全避免这些细节,可以在循环的每次迭代结束时将其除以10:
while (x > 0)
{
int endDig = x % 10;
//...
x /= 10;
}
现在您不再需要担心int
的限制,因为您的数字永远不会大于原始输入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.