setprecision问题!不同平台结果不一样!

setoy 2013-06-10 09:09:30
double a = 2.500;
cout << setprecision(0) << fixed;
cout << a << endl;

-------------------------
dev-c++ 4.9.9.2,windows7平台下结果是3
linux自带g++结果是2
咋会这样?
...全文
340 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
setoy 2013-06-20
  • 打赏
  • 举报
回复
引用 15 楼 zhao4zhong1 的回复:
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理,用二进制小数也不能精确表示某些10进制小数。
原来如此
赵4老师 2013-06-17
  • 打赏
  • 举报
回复
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理,用二进制小数也不能精确表示某些10进制小数。 float.h
...
#define DBL_DIG         15                      /* # of decimal digits of precision */
#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG    53                      /* # of bits in mantissa */
#define DBL_MAX         1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP  308                     /* max decimal exponent */
#define DBL_MAX_EXP     1024                    /* max binary exponent */
#define DBL_MIN         2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP  (-307)                  /* min decimal exponent */
#define DBL_MIN_EXP     (-1021)                 /* min binary exponent */
#define _DBL_RADIX      2                       /* exponent radix */
#define _DBL_ROUNDS     1                       /* addition rounding: near */

#define FLT_DIG         6                       /* # of decimal digits of precision */
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD       0
#define FLT_MANT_DIG    24                      /* # of bits in mantissa */
#define FLT_MAX         3.402823466e+38F        /* max value */
#define FLT_MAX_10_EXP  38                      /* max decimal exponent */
#define FLT_MAX_EXP     128                     /* max binary exponent */
#define FLT_MIN         1.175494351e-38F        /* min positive value */
#define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */
#define FLT_MIN_EXP     (-125)                  /* min binary exponent */
#define FLT_NORMALIZE   0
#define FLT_RADIX       2                       /* exponent radix */
#define FLT_ROUNDS      1                       /* addition rounding: near */
...
赵4老师 2013-06-17
  • 打赏
  • 举报
回复
仅供参考
//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);
}
setoy 2013-06-17
  • 打赏
  • 举报
回复
引用 10 楼 supermegaboy 的回复:
[quote=引用 楼主 setoy 的回复:]
double a = 2.500;
cout << setprecision(0) << fixed;
cout << a << endl;
------------------------- dev-c++ 4.9.9.2,windows7平台下结果是3 linux自带g++结果是2 咋会这样?
原因是受a的精度影响,2.500在某些环境下可能会被保存为2.499....,而precision对于超出位数的数字是进行四舍五入的,因此2.499....就仅剩下2了。[/quote] 看来只能这样理解了~~~~~ c++标榜平台无关性,实际上这种细微的地方都做不出平台无关性。 另外,四舍五入用setprecision的风险太大了!
飞天御剑流 2013-06-15
  • 打赏
  • 举报
回复
引用 楼主 setoy 的回复:
double a = 2.500;
cout << setprecision(0) << fixed;
cout << a << endl;
------------------------- dev-c++ 4.9.9.2,windows7平台下结果是3 linux自带g++结果是2 咋会这样?
对了,还是不明白的话,可改为double a = 2.600;再看看结果你就明白了。
飞天御剑流 2013-06-15
  • 打赏
  • 举报
回复
引用 9 楼 ananluowei 的回复:
setprecision(0)理解为设置精度0 逻辑上都已经错误了,还研究怎么处理是正确的?
与数字n没关系,precision的参数可为任意值。
飞天御剑流 2013-06-15
  • 打赏
  • 举报
回复
引用 楼主 setoy 的回复:
double a = 2.500;
cout << setprecision(0) << fixed;
cout << a << endl;
------------------------- dev-c++ 4.9.9.2,windows7平台下结果是3 linux自带g++结果是2 咋会这样?
原因是受a的精度影响,2.500在某些环境下可能会被保存为2.499....,而precision对于超出位数的数字是进行四舍五入的,因此2.499....就仅剩下2了。
大尾巴猫 2013-06-15
  • 打赏
  • 举报
回复
setprecision(0)理解为设置精度0 逻辑上都已经错误了,还研究怎么处理是正确的?
setoy 2013-06-15
  • 打赏
  • 举报
回复
还能再顶一下吗???
setoy 2013-06-13
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
摒弃cout;使用printf!
坚持cout! 对于楼主的问题有啥看法?
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
摒弃cout;使用printf!
setoy 2013-06-13
  • 打赏
  • 举报
回复
引用 3 楼 taodm 的回复:
去查《标准C++输入输出流与本地化》
谢谢!这本书对io比较详细,但是也没有给出类似2.5000这样的实数四舍五入的介绍,也没有setprecision的具体原理
setoy 2013-06-13
  • 打赏
  • 举报
回复
看来~~~~这真是个难题
setoy 2013-06-11
  • 打赏
  • 举报
回复
在线等~~~~~~都过端午去了吗?
taodm 2013-06-11
  • 打赏
  • 举报
回复
去查《标准C++输入输出流与本地化》
jzp12 2013-06-11
  • 打赏
  • 举报
回复
四舍五入不一样?

65,183

社区成员

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

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