C 浮点数无法按预期工作

C 浮点数无法按预期工作,c,floating-point,C,Floating Point,在下面的代码中,当我输入1102时,sum被打印为52,sum3被打印为31.200001,而shld是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

在下面的代码中,当我输入1102时,sum被打印为52,sum3被打印为31.200001,而shld是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;
}
intmain(){
int t,n,i,a[2000],m,j,f;
scanf(“%d”、&t);
而(t--){
scanf(“%d”和“&n”);
scanf(“%d”、&f);

对于(i=0;i这是
float
s的本质。它们不能保证完全准确


有关这种情况的方式/原因的更多详细信息,请参见。

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


有关这种情况的详细信息,请参阅。

31.2在二进制浮点中不是一个可表示的数字。无论使用何种计算方法生成它,都永远不会得到与31.2完全相等的浮点。您得到的答案与您合理预期的一样好。

31.2在二进制f中不是一个可表示的数字浮动点。无论使用何种计算方法,都不会得到正好等于31.2的浮动。您得到的答案与您合理预期的一样好。

来源:

为什么我的数字,比如0.1+0.2加起来不等于0.3,然后 相反,我得到了一个奇怪的结果,比如0.300000000004?

因为在内部,计算机使用一种格式(二进制浮点) 这根本不能准确地表示0.1、0.2或0.3这样的数字

当编译或解释代码时,您的“0.1”已被删除 按该格式四舍五入到最接近的数字,这将导致较小的 甚至在计算之前就存在舍入误差

发件人:

为什么我的数字,比如0.1+0.2加起来不等于0.3,然后 相反,我得到了一个奇怪的结果,比如0.300000000004?

因为在内部,计算机使用一种格式(二进制浮点) 这根本不能准确地表示0.1、0.2或0.3这样的数字

当编译或解释代码时,您的“0.1”已被删除 按该格式四舍五入到最接近的数字,这将导致较小的 甚至在计算之前就存在舍入误差


…但您可以尝试减少这种可能性。您需要考虑加法/减法的指数以及其他因素。

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

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


如果你需要一个接近小数31.2的数字,考虑使用类型<代码>双< /代码>,其中你的结果将是“代码>31.99 99 99 99 99 99 94 6 94 269 899 912 88 1275 73242 1875 < <或代码>或8782019273372467×2-48

< P >十进制数字31.2不能表示为二进制分数。>浮点数
31.200000762939453125
,正好是8178893*2-18

如果你需要一个接近小数31.2的数字,考虑使用类型<代码>双< /代码>,其中你的结果将是“代码> 31.99、99、99、99、929、4、4、9、9、1212、88、75、73、242、1875、< /代码>或8782019273372467×2-48

printf(“%g\n”,sum3);
而不是
printf(“%f\n”,sum3);
在您的代码中,以获得正确的输出

我希望它能起作用。

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


我希望它能起作用。

可能重复的。如果没有充分的理由,不要对浮点数使用
float
,而是使用
double
。“老师告诉我们要使用
float
”在试图说服她之前,这不是一个使用
float
的好理由;如果她坚持……哦,好吧……可能的重复没有好的理由,不要对浮点数使用
float
:改用
double
。“老师告诉我们要使用
float
”在试图说服她之前,这不是使用float的好理由;如果她坚持的话……哦,好吧。。。