printf关于浮点数的四舍五入的奇怪问题?

#include

#include
using namespace std;

int main()
{
double lfOut=(4.1*3.0*2.5*0.65-1)*2; //37.975

double lfOut2=37.975;
printf("%.2f\n",(double)(37.975)); //输出37.98,有进位
printf("%.2f\n",lfOut); //输出37.97,无进位,为什么?
printf("%.2f\n",lfOut2); //输出37.98
cout<<"lfOut:"<<lfOut<<endl; //输出37.975

}

上面通过表达式计算出来37.975使用 "%.2f"输出时,为什么没有进位呢?

图片说明

float精度只有6位,如果你个位数只有1位,就可以保证小数点后两位了,而double有16位精度,故可以保证小数点后几位。

‡ lfOut 37.974999999999994 double 四舍五入,结果是37.97

数据是37.97499999999