簡體   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