gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:33 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com