在下面的代码中,当我输入为1 10 2 1 2 2时,sum打印为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 :(得分:5)
为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而且 相反,我得到一个奇怪的结果,如0.30000000000000004?
因为在内部,计算机使用格式(二进制浮点) 它不能准确地表示0.1,0.2或0.3之类的数字。
编译或解释代码时,您的“0.1”已经存在 四舍五入到该格式的最接近的数字,这导致一个小的 甚至在计算发生之前就会出现舍入错误。
答案 1 :(得分:2)
十进制数31.2不能表示为二进制分数。更具体地说,类型float
的最近值是31.200000762939453125
,正好是8178893 * 2 -18 。
如果您需要一个更接近小数31.2的数字,请考虑使用类型double
,其结果为31.199999999999999289457264239899814128875732421875
或8782019273372467 * 2 -48 < / p>
答案 2 :(得分:0)
这是float
的性质。它们不能保证完全准确。
有关如何/为何如此的详细信息,请参阅here。
答案 3 :(得分:0)
31.2不是二进制浮点数中的可表示数字。无论用什么计算来产生它,你都不会得到一个完全等于31.2的浮点数。你得到的答案与你可以合理预期的一样好。
答案 4 :(得分:0)
..但你可以尝试减少这种可能性。你需要考虑加法/减法的指数等等。
答案 5 :(得分:0)
你可以使用
printf("%g\n",sum3);
代替
printf("%f\n",sum3);
在你的代码中获得正确的输出..
我希望它能奏效。