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

标签 c# algorithm

我试图反转一个整数,但出于某种原因,我收到一个运行时错误,提示“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/

相关文章:

algorithm - 如何有效地计算二项式累积分布函数?

algorithm - 处理各种日志记录级别

C++ 直接将 cin 复制到 cout 中,但顺序相反

python - 从字符串中读取数据,区分元素是数字还是数组

c# - 如何使用栈代替列表?

c# - 什么时候使用公共(public)字段才有意义?

c# - 如何从未由 MEF 容器实例化的对象中导出部件

c - 交替序列查找器

c# - JSON.NET 和数组使用 LINQ

c# - CSP 未检测到智能卡微型驱动程序 C#