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"输出时,为什么没有进位呢?

4个回答

图片说明

K346K346
恋上猫的大鲤鱼 这个和一个计算机常识有关。计算机的世界是离散的,大部分浮点数无法使用二进制精确表示,比如0.1在计算机中无法精确表示。具体可以参考文章:https://blog.csdn.net/justjavac/article/details/8178044上面的37.975也是。通过表达式计算和实际给出数值,两个37.975看似一样,实际数值是不一样的,导致进位出现差异。使用代码可以看到二者的区别: printf("%.18lf\n",37.975); //输出37.975000000000001421 printf("%.18lf\n",(4.1*3.0*2.5*0.65-1)*2); //输出37.974999999999994316
2 年多之前 回复

数据是37.97499999999

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐