当我尝试使用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