关于setprecision流操纵符的问题
比如有一个double变量a为0.8915cout<<setprecision(3)<<a;该语句输出为0.891,如果把a的值定义为0.8916,则输出为0.892,这...
比如有一个double变量a为0.8915
cout << setprecision(3) << a;
该语句输出为0.891,如果把a的值定义为0.8916,则输出为0.892,这是怎么回事?我只听说过四舍五入,还听说过四舍五留六入,可从来没有听说过五舍六入这么一说。为什么setprecision会出现这种诡异的问题?请高手们解释一下,谢谢!
我的编译平台:windows vista + visual studio 2008 展开
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时,直接将尾数舍去。
例如将下列数字全部修约为四位有效数字,结果为:
0.53664——0.5366
10.2731——10.27
18.5049——18.50 0.58344——0.5834
16.4005——16.40
27.1829——27.18
(二)当尾数大于或等于6时,将尾数舍去并向前一位进位。
例如将下列数字全部修约为四位有效数字,结果为:
0.53666——0.5367
8.3176——8.318
16.7777——16.78 0.58387——0.5839
10.29501——10.30
21.0191——21.02
(三)当尾数为5,而尾数后面的数字均为0时,应看尾数“5”的前一位:若前一位数字此时为奇数,就应向前进一位;若前一位数字此时为偶数,则应将尾数舍去。数字“0”在此时应被视为偶数。
例如将下列数字全部修约为四位有效数字,结果为:
0.153050——0.1530
12.6450——12.64
18.2750——18.28 0.153750——0.1538
12.7350——12.74
21.845000——21.84
(四)当尾数为5,而尾数“5”的后面还有任何不是0的数字时,无论前一位在此时为奇数还是偶数,也无论“5”后面不为0的数字在哪一位上,都应向前进一位。
例如将下列数字全部修约为四位有效数字,结果为:
0.326552——0.3266
12.73507——12.74
21.84502——21.85 12.64501——12.65
18.27509——18.28
38.305000001——38.31
按照四舍六入五留双规则进行数字修约时,也应像四舍五入规则那样,一次性修约到指定的位数,不可以进行数次修约,否则得到的结果也有可能是错误的。例如将数字10.2749945001修约为四位有效数字时,应一步到位:10.2749945001——10.27(正确)。如果按照四舍六入五留双规则分步修约将得到错误结果:10.2749945001——10.274995——10.275——10.28(错误)。
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时,直接将尾数舍去。
例如将下列数字全部修约为四位有效数字,结果为:
0.53664——0.5366
10.2731——10.27
18.5049——18.50 0.58344——0.5834
16.4005——16.40
27.1829——27.18
(二)当尾数大于或等于6时,将尾数舍去并向前一位进位。
例如将下列数字全部修约为四位有效数字,结果为:
0.53666——0.5367
8.3176——8.318
16.7777——16.78 0.58387——0.5839
10.29501——10.30
21.0191——21.02
(三)当尾数为5,而尾数后面的数字均为0时,应看尾数“5”的前一位:若前一位数字此时为奇数,就应向前进一位;若前一位数字此时为偶数,则应将尾数舍去。数字“0”在此时应被视为偶数。
例如将下列数字全部修约为四位有效数字,结果为:
0.153050——0.1530
12.6450——12.64
18.2750——18.28 0.153750——0.1538
12.7350——12.74
21.845000——21.84
(四)当尾数为5,而尾数“5”的后面还有任何不是0的数字时,无论前一位在此时为奇数还是偶数,也无论“5”后面不为0的数字在哪一位上,都应向前进一位。
例如将下列数字全部修约为四位有效数字,结果为:
0.326552——0.3266
12.73507——12.74
21.84502——21.85 12.64501——12.65
18.27509——18.28
38.305000001——38.31
按照四舍六入五留双规则进行数字修约时,也应像四舍五入规则那样,一次性修约到指定的位数,不可以进行数次修约,否则得到的结果也有可能是错误的。例如将数字10.2749945001修约为四位有效数字时,应一步到位:10.2749945001——10.27(正确)。如果按照四舍六入五留双规则分步修约将得到错误结果:10.2749945001——10.274995——10.275——10.28(错误)。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询