首页 > 解决方案 > 为什么 float 输出的结果与 double 不同?

问题描述

我有一个程序,如果我使用浮点数它会输出29.325001,但如果我使用双倍它29.325000这是正确的结果)。

我认为 float 会四舍五入到小数点后 14 位,但它产生的结果与预期不同?

下面的代码:

    int elements, i;

scanf("%d", &elements);

if (elements > 10){
    return 0;
}

float ppp[10], takeHowMuch[10], total;

for (i = 0; i < elements; i++){
    scanf("%f", &ppp[i]);
}

for (i = 0; i < elements; i++){
    scanf("%f", &takeHowMuch[i]);
}

total = (takeHowMuch[0] * ppp[0]) + (takeHowMuch[1] * ppp[1]) + (takeHowMuch[2] * ppp[2]) + (takeHowMuch[3] * ppp[3]);

printf("%.6f", total);

return 0;

标签: cdouble

解决方案


“我认为 float 会四舍五入到小数点后 14 位,”

代码精度期望太高。

典型float显示为十进制编码,如预期的那样,至少有 6 个前导有效数字。 29.325001是 8。

采用FLT_DIG

// printf("%.6f", total);
printf("%.*e\n", FLT_DIG - 1, total);
printf("%.*g\n", FLT_DIG, total);

输出

2.93250e+01
29.325

推荐阅读