关于C++中double变量精度损失的问题

Lenhoon 2015-03-04 01:47:11
使用如下语句输出
cout.setf(ios::fixed);
cout<<setprecision(3)<<14.5*0.01;//此时输出为0.145;
cout<<setprecision(2)<<14.5*0.01;//此时输出是0.14,按照四舍五入此时应该输出的是0.15啊!!!调试变量观察14.5*0.01 double型的值为0.149999999999999999999999,但是如果直接出入保存到double型中是都不会有精度损失,只要一和double运算则0.145都会自动变为0.149999999999999,请问这种问题该如何解决????
...全文
1694 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
greex 2015-03-06
  • 打赏
  • 举报
回复
4楼正确。
赵4老师 2015-03-04
  • 打赏
  • 举报
回复
赵4老师 2015-03-04
  • 打赏
  • 举报
回复
仅供参考
//Round(1.234,2) = 1.23
//Round(1.234,0) = 1.0
//Round(123.4,-1) = 120.0
double Round(double dVal, short iPlaces) {
    double dRetval;
    double dMod = 0.0000001;
    if (dVal<0.0) dMod=-0.0000001;
    dRetval=dVal;
    dRetval+=(5.0/pow(10.0,iPlaces+1.0));
    dRetval*=pow(10.0,iPlaces);
    dRetval=floor(dRetval+dMod);
    dRetval/=pow(10.0,iPlaces);
    return(dRetval);
}

double round(double dVal, short iPlaces) //iPlaces>=0
{
    unsigned char s[20];
    double dRetval;

    sprintf(s,"%.*lf",iPlaces,dVal);
    sscanf(s,"%lf",&dRetval);
    return (dRetval);
}
勤奋的小游侠 2015-03-04
  • 打赏
  • 举报
回复
无法解决,你要想四舍五入,可以加个0.0005然后再截。
Aist-memory 2015-03-04
  • 打赏
  • 举报
回复
C++无四舍五入
mymtom 2015-03-04
  • 打赏
  • 举报
回复
C++里是截断的,不会四舍五入

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧