[英](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
的限制,因為您的數字永遠不會大於原始輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.