c语言中分数值为5时如何改变前一个分数值

How can i change the previous fraction value when the fraction value is 5. in c language

我试图编写一个代码,如果小数值是 0.005,那么它会在十进制值之后将值打印为 0.01。我尝试使用 %0.02f 但此方法无效。下面是我的完整代码和输入值。

    #include<stdio.h>
int main()
{
    float a,b,c=0,d=0,e=0;
    while(1)
    {
        a=0;b=0;c=0,d=0,e=0;
    scanf("%f%f",&a,&b);
    c=b-a;
    d=c*100.0;
    e=d/a;
    //printf("%0.2f\n%0.2f\n%0.2f\n",c,d,e);
    printf("%0.2f%%\n",e);
    }

    return 0;
}

输入999.95 1000.00

预期输出 = 0.01%

我的输出=0.00%

根据您在问题中的措辞,您可能忘记了代码 %0.2 中的“0”。

你的数学,用 32 位 floats,得出 e 的最终值 0.004999...,而不是 "logical" 0.005 你期望(并期望四舍五入到 0.01)。那是 just how it is with floating point math。将其四舍五入到小数点后两位准确地将结果描述为 0.00;它小于 0.005,因此四舍五入为 0.00,而不是 0.01

使用更精确的类型 (double) 可能 有帮助(在我的机器上确实如此 [在将 scanf 更改为使用 %lf],但许多编译器,尤其是具有更高优化的编译器和某些体系结构,违反了 IEEE-754 规范,并且可能不同意),但从根本上说,浮点数学会引入相对于精确逻辑算术的错误,因此您应该使用不同的方法如果你不能容忍小错误,例如基于定点 int 的数学,或 libmpdec 或类似的全十进制(基数 10)浮点数学。

请注意,根据您选择的操作,您可能需要注意舍入模式; C99 将值从零四舍五入,但还有其他舍入模式(四舍五入是一种常见的模式,因为没有在舍入中引入偏差)四舍五入到小数点后两位时会产生 0.00,即使你确实准确地生产了0.005