繁体   English   中英

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

[英](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的限制,因为您的数字永远不会大于原始输入。

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

在此处输入图片说明

我不认为它会返回0.9999并通过将其强制转换为整数而被截断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM