浮点数不能按预期工作

在下面的代码中,当我输入为1 10 2 1 2 2时,总和打印为52,sum3打印为31.200001,而它的输入为31.200000

int main(){ int t,n,i,a[2000],m,j,f; scanf("%d",&t); while(t--){ scanf("%d",&n); scanf("%d",&f); for(i=0;i<f;i++){ scanf("%d",&a[i]); } scanf("%d",&m); if(n!=0){ int sum=n*(n+1)/2; int sum2=0; for(j=0;j<i;j++){ sum2+=a[j]; } sum-=sum2; printf("%d\n",sum); float sum3; if(n%2==0) sum3=(1.0-2.0*m/n)*sum; else sum3=(1.0-2.0*m/(n+1))*sum; printf("%f\n",sum3); } else printf("0.0000\n"); } return 0; } 

从浮点指南 :

为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而是我得到一个奇怪的结果,如0.30000000000000004?

因为在内部,计算机使用的格式(二进制浮点)无法准确地表示0.1,0.2或0.3之类的数字。

编译或解释代码时,“0.1”已经四舍五入到该格式中最接近的数字,这甚至在计算发生之前就会导致小的舍入误差。

十进制数31.2不能表示为二进制分数。 更具体地说, float类型的最近值是31.200000762939453125 ,正好是8178893 * 2 -18

如果你需要一个更接近小数31.2的数字,可以考虑使用double类型,其中你的结果是31.199999999999999289457264239899814128875732421875或8782019273372467 * 2 -48

这是float的本质。 它们不能保证完全准确。

有关如何/为何如此的详细信息,请参见此处 。

31.2不是二进制浮点数中的可表示数字。 无论用什么计算来产生它,你都不会得到一个完全等于31.2的浮点数。 你得到的答案与你可以合理预期的一样好。

..但你可以尝试减少这种可能性。 您需要考虑加法/减法的指数以及其他内容。

你可以使用printf("%g\n",sum3); 而不是printf("%f\n",sum3); 在你的代码中获得正确的输出..

我希望它能奏效。