首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-07-01 
setprecision问题!不同平台结果不一样!double a 2.500cout setprecision(0) fixedcout a

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

double a = 2.500;
cout << setprecision(0) << fixed;
cout << a << endl;

-------------------------
dev-c++ 4.9.9.2,windows7平台下结果是3
linux自带g++结果是2
咋会这样?
[解决办法]
四舍五入不一样?
[解决办法]
去查《标准C++输入输出流与本地化》
[解决办法]
摒弃cout;使用printf!
[解决办法]
引用:
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了。
[解决办法]
引用:
setprecision(0)理解为设置精度0
逻辑上都已经错误了,还研究怎么处理是正确的?


与数字n没关系,precision的参数可为任意值。
[解决办法]
引用:
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;再看看结果你就明白了。
[解决办法]
仅供参考
//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);
}

[解决办法]
用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 */
...

热点排行