2009-10-10 35 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; 
    }