1/2-2/3+3/5-5/8...前n项和 计算结果保留2位小数 输出应为-0.19 问题出在哪

#include

int main()
{
double i,j,a=1.0,b=2.0,s=0.0,t=0.0,m=2.0,n=3.0;
float q;
scanf("%f",&q);
for(i=1;i<=q;i++)
{
s=s+a/b;
a=a+b;
b=b+a;

}
for(j=1;j<=q;j++)
{
    t=t+m/n;
    m=m+n;
    n=n+m;
}
printf("%.2f",s-t);
return 0;

}

浮点数由于计算机内部表示的原因可能会有微小的误差。
因此浮点数比较相等不能直接用 <= == >=
可以参考这篇博客:
http://blog.csdn.net/xiaolongwang2010/article/details/8520859

另外通常也不用浮点数作为循环变量。

如果对您有帮助,请点击采纳答案好吗,谢谢~~

JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差。待小数都换算为二进制后,再进行二进制间的运算,得到二进制结果。然后再将二进制结果换算为十进制,这里通常会出现第二次的误差。

if(0.1 + 0.1 === 0.3){ console.log("完全等于"); }else{ console.log("不完全等于"); }
控制台输出:不完全等于!
要避免这种情况呢,通常可以将小数同时扩大相同整倍数,完成计算后,在去掉之前添加的整倍数。