关于setprecision流操纵符的问题

来源:百度知道 编辑:UC知道 时间:2024/05/04 09:53:20
比如有一个double变量a为0.8915
cout << setprecision(3) << a;
该语句输出为0.891,如果把a的值定义为0.8916,则输出为0.892,这是怎么回事?我只听说过四舍五入,还听说过四舍五留六入,可从来没有听说过五舍六入这么一说。为什么setprecision会出现这种诡异的问题?请高手们解释一下,谢谢!
我的编译平台:windows vista + visual studio 2008

这是现在普遍采用的进位制,四舍五入已经OUT了,请仔细看下面的:

1算量计算时的小数点处理-数值修约规则

在进行具体的数字运算前,按照一定的规则确定一致的位数,然后舍去某些数字后面多余的尾数的过程被称为数字修约,指导数字修约的具体规则被称为数字修约规则。

现在被广泛使用的数字修约规则主要有四舍五入规则和四舍六入五留双规则。

四舍五入规则

四舍五入规则是人们习惯采用的一种数字修约规则。

四舍五入规则的具体使用方法是:

在需要保留有效数字的位次后一位,逢五就进,逢四就舍。

例如:将数字2.1875精确保留到千分位(小数点后第三位),因小数点后第四位数字为5,按照此规则应向前一位进一,所以结果为2.188。同理,将下列数字全部修约为四位有效数字,结果为:

0.53664——0.5366

10.2750——10.28

18.06501——18.07 0.58346——0.5835

16.4050——16.41

27.1850——27.19

按照四舍五入规则进行数字修约时,应一次修约到指定的位数,不可以进行数次修约,否则将有可能得到错误的结果。例如将数字15.4565修约为两位有效数字时,应一步到位:15.4565——15(正确)。如果分步修约将得到错误的结果:15.4565——15.457——15.46——15.5——16(错误)。

四舍五入修约规则,逢五就进,必然会造成结果的系统偏高,误差偏大,为了避免这样的状况出现,尽量减小因修约而产生的误差,在某些时候需要使用四舍六入五留双的修约规则。

四舍六入五留双规则

为了避免四舍五入规则造成的结果偏高,误差偏大的现象出现,一般采用四舍六入五留双规则。

四舍六入五留双规则的具体方法是:

(一)当尾数小于或等于4时,直接将尾数舍去。

例如将下列数字全部修约为四位有效数字,结果为: