我试图反转一个整数,由于某种原因,我收到一个RunTime错误,说“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;
}
答案 0 :(得分:6)
您遇到了基于计算机的算术的限制。 (另一个答案显示了我在以前版本的答案中不正确的细节。)为了完全避免这些细节,你可以在循环的每次迭代结束时除以10:
while (x > 0)
{
int endDig = x % 10;
//...
x /= 10;
}
现在您不再需要担心int
的限制,因为您的号码永远不会超过原始输入。
答案 1 :(得分:6)
此处除以零的原因与将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
}
当然,在那一点上你已经意识到你的反转数字算法不是很好,所以请参考另一个答案以获得更好的方法。
答案 2 :(得分:2)