C的四舍五入是这样的一个机制?

#include <stdio.h>
int main() {
    double a;
    a = 0.0045;
    printf("a=%.3f", a);
}

#include <stdio.h>
int main() {
    double a;
    a = 0.00456;
    printf("a=%.3f", a);
}        
    
为什么前者没有做四舍五入,输出了a=0.004,而后者做了四舍五入,输出a=0.005呢?难道是0.00450.00456在计算机中用什么不同吗?C



c语言用,要大于5才会进行进位,比如a=0.0045,它也等于0.00450,由于保留3位小数,就要看后面的值是否大于50,如果不大于50,则会舍去,
同理下面的a=0.00456,由于保留3位小数,后面的小数位为56,大于50,则会发生进位。
举例说明:

#include <stdio.h>
int main() {
    double a,b,c;
    a=0.0045;
    b=0.00456;
    c=0.00451;
    printf("a=%.3f\n", a);
    printf("b=%.3f\n", b);
    printf("c=%.3f\n", c);
    return 0;
}

img

不管是float还是double,都是用二进制的浮点小数来表示十进制的小数,这当中有由于进制转换带来的舍或入的误差,这段程序你可以看到内部的近似值是多少:
#include <stdio.h>
#include <stdlib.h>

int main()
{
double a = 0.0045, b = 0.0044999999999999997;
printf("%.3f ", a);
if ( a == b)
printf("True");
else
printf("False");
return 0;
}
运行结果
0.0044999999999999997 True
表明在内部的存储值确实是小于0.0045的

我以为C是向偶数舍入的,没想到居然是向零舍入。。。

C语言printf函数%.2f输出为什么四舍五入实现机制不同? - 知乎 #include<bits/stdc++.h> int main(){ float a = 20.005;//10.005 printf("保留两位小数:\n&… https://www.zhihu.com/question/364159510