我试图反转一个整数,但出于某种原因,我收到一个运行时错误,提示“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)
转换为 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
}
当然,那时你已经意识到你的数字反转算法不是一个好的算法,所以请引用另一个答案以获得更好的方法。
关于c# - (int) Math.Pow(10, 0) 返回零而不是一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47821061/