一道书上的练习题有些不懂


#include <stdio.h>
int main()
{
    double x = 5.16894;
    printf("%f\n",(int)(x*1000+0.5)/(double)1000);
}
 

为啥最后把计算结果转换为了int类型但输出的值是5.169000呢,转换成int不是跟前面的格式控制%f不一致了吗

强制类型转换优先级高,先转换,后做除法
除法的除数是double,返回浮点
严格来说,应该用 lf 不是 f

引用gpt回答 很详细 有帮助采纳一下

在这个代码中,x的值是5.16894。
语句(int)(x1000+0.5)的作用是对x四舍五入到小数点后3位。
x
1000将小数点右移3位,变成5168.94。
然后加上0.5作为四舍五入,结果是5169.44。
将其转换为int类型,就变成了5169,实现了四舍五入。
但是打印语句使用了%f来输出,这会显示一个double类型的浮点数。
所以即使运算结果是int类型,在打印时还会被转换成double类型再输出,从而显示了小数点后的0。
也就是说:

  1. 计算时对值进行取整,四舍五入到整数
  2. 打印时使用%f指定输出浮点格式
    两者的类型不一致,但%f会自动转换int为double进行输出,因此打印结果是5.169000。
    如果想打印结果也为整数,应该使用%d格式控制:
printf("%d\n", (int)(x*1000+0.5)/(double)1000); 

或者也可以计算时保留为double类型:

printf("%f\n", (x*1000+0.5)/1000);

需要注意计算过程和打印格式的类型一致性,才能保证运行结果符合预期。