(int)Math.Pow(10,0)返回零而不是

时间:2017-12-14 19:52:07

标签: c# algorithm

我试图反转一个整数,由于某种原因,我收到一个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;
        }

3 个答案:

答案 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)

Math.Pow(10,0)返回1。

enter image description here

我不认为它返回0.9999并将其转换为int它被截断。