2009-10-10 65 views
5

當我嘗試使用C#取出一個小數的第N個根時,我得到一個錯誤的數字。小數的第N個根返回C#中的意外結果

例如,當我嘗試取1.07的第三個根時,我得到1,這顯然不正確。

這裏是我用來得到第三根的確切代碼。

MessageBox.Show(Math.Pow(1.07,(1/3)).toString()); 

我該如何解決這個問題?

我想這是一個浮點算術問題,但我不知道如何處理它。

+2

它實際上是一個整數除法問題。 1/3被評估爲整數,除法結果爲0.因此,你真的是1.07到0的權力,這是1。 – tvanfosson

回答

9

我很肯定你給的「確切代碼」不能編譯。

MessageBox.Show(Math.Pow(1.07,(1/3).toString())); 

到的toString的調用是在錯誤的嵌套級別,必須的ToString,和(1/3)是整數除法,這可能是你遇到的實際問題。 (1/3)是0,任何零權力的東西是1.你需要使用(1.0/3.0)或(1d/3d)或...

+0

親愛的隊長諷刺。對不起,錯了)。我應該複製並粘貼而不是重新輸入。我現在已更正了信息。謝謝你的出色答案! –

+0

ps。工作很好 –

+6

我通常不會指出一個明顯的語法錯誤,但不知何故感覺有義務,因爲你不屑於使用「確切」這個詞。很高興幫助。 –

13

C#是治療1個3的整數,你需要做到以下幾點:

Math.Pow(1.07,(1d/3d)) 

Math.Pow(1.07,(1.0/3.0)) 

它實際上是有趣的,因爲隱含的寬化轉換讓你做一個錯誤。

3

首先要做的事情是:再利用,有可能出錯了編譯器:-)

MessageBox.Show(Math.Pow(1.07,(1/3).toString())); 

將評估(1/3)的ToString()第一,然後嘗試,提高1.07到字符串的力量。

我想你的意思:

MessageBox.Show(Math.Pow(1.07,(1/3)).ToString()); 

至於問題,(1/3)被當作一個整數除法返回0和n 0 1對於n的所有值。

你需要用1.0/3.0這樣的東西強制它進行浮點除法。

+0

對不起,錯了)。我應該複製並粘貼而不是重新輸入。我現在已更正了信息。 –

1

這可能的情況下,幫您擁有一個真正的n次方根的精度問題,但我的experiance是,內建Math.Pow(雙,INT)更精確:

private static decimal NthRoot(decimal baseValue, int N) 
    { 
     if (N == 1) 
      return baseValue; 
     decimal deltaX; 
     decimal x = 1M; 
     do 
     { 
      deltaX = (baseValue/Pow(x, N - 1) - x)/N; 
      x = x + deltaX; 
     } while (Math.Abs(deltaX) > 0); 
     return x; 
    } 

    private static decimal Pow(decimal a, int b) 
    { 
     if (b == 0) return 1; 
     if (a == 0) return 0; 
     if (b == 1) return a; 
     if (b % 2 == 0) 
      return Pow(a * a, b/2); 
     else if (b % 2 == 1) 
      return a * Pow(a * a, b/2); 
     return 0; 
    }