當我嘗試使用C#取出一個小數的第N個根時,我得到一個錯誤的數字。小數的第N個根返回C#中的意外結果
例如,當我嘗試取1.07的第三個根時,我得到1,這顯然不正確。
這裏是我用來得到第三根的確切代碼。
MessageBox.Show(Math.Pow(1.07,(1/3)).toString());
我該如何解決這個問題?
我想這是一個浮點算術問題,但我不知道如何處理它。
當我嘗試使用C#取出一個小數的第N個根時,我得到一個錯誤的數字。小數的第N個根返回C#中的意外結果
例如,當我嘗試取1.07的第三個根時,我得到1,這顯然不正確。
這裏是我用來得到第三根的確切代碼。
MessageBox.Show(Math.Pow(1.07,(1/3)).toString());
我該如何解決這個問題?
我想這是一個浮點算術問題,但我不知道如何處理它。
我很肯定你給的「確切代碼」不能編譯。
MessageBox.Show(Math.Pow(1.07,(1/3).toString()));
到的toString的調用是在錯誤的嵌套級別,必須的ToString,和(1/3)是整數除法,這可能是你遇到的實際問題。 (1/3)是0,任何零權力的東西是1.你需要使用(1.0/3.0)或(1d/3d)或...
親愛的隊長諷刺。對不起,錯了)。我應該複製並粘貼而不是重新輸入。我現在已更正了信息。謝謝你的出色答案! –
ps。工作很好 –
我通常不會指出一個明顯的語法錯誤,但不知何故感覺有義務,因爲你不屑於使用「確切」這個詞。很高興幫助。 –
C#是治療1個3的整數,你需要做到以下幾點:
Math.Pow(1.07,(1d/3d))
或
Math.Pow(1.07,(1.0/3.0))
它實際上是有趣的,因爲隱含的寬化轉換讓你做一個錯誤。
首先要做的事情是:再利用,有可能出錯了編譯器:-)
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
這樣的東西強制它進行浮點除法。
對不起,錯了)。我應該複製並粘貼而不是重新輸入。我現在已更正了信息。 –
這可能的情況下,幫您擁有一個真正的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;
}
它實際上是一個整數除法問題。 1/3被評估爲整數,除法結果爲0.因此,你真的是1.07到0的權力,這是1。 – tvanfosson