【数据小常识】“四舍六入五成双”

“四舍六入五成双”规则如下:

“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上。

"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;5后无有效数字时,需要分两种情况来讲:5前为奇数,舍5入1;5前为偶数,舍5不进(0是偶数)。

一、具体计算规则:

1)被修约的数字小于5时,该数字舍去;

2)被修约的数字大于5时,则进位;

3)被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。

二、来由:

这一方式的另一个常见名称为“银行家舍入”,是IEEE754标准的推荐舍入标准。这一方式跟通常的四舍五入相比,平均数方面更能保持原有数据的特性。

三、举例:

 

9.8249=9.82, 9.82671=9.83

9.8350=9.84, 9.8351 =9.84

9.8250=9.82, 9.82501=9.83

 

 

jsNumber.toFixed()实际的精度确认规则是四舍六入五成双,逢四下舍,逢六入一,逢五时,根据浏览器内核计算结果也不尽相同。

from pyecharts_javascripthon.dom import Number      # for Number module

 

Number(9.249).toFixed(2)

"9.25"

Number(9.82671).toFixed(2)

"9.83"

Number(9.8350).toFixed(2)

"9.84"

Number(9.8351).toFixed(2)

"9.84"

Number(9.8250).toFixed(2)

"9.82"

Number(9.82501).toFixed(2)

"9.83"

jsMath.round()实际的精度确认规则是四舍六入五成双,逢四下舍,逢六入一,逢五时,根据浏览器内核计算结果也不尽相同。

from pyecharts_javascripthon.dom import Math      # for Math module

 

Number(point*100).toFixed(2)+"%"

"0.42%"

Math.round(0.00999 * 10000) / 100 + "%"

"1%"

Number(0.00988*100).toFixed(2)+"%"

"0.99%"

Math.round(0.00984 * 10000) / 100 + "%"

"0.98%"

Number(0.00984*100).toFixed(2)+"%"

"0.98%"

 

(window.parseFloat(0.02451)*100).toFixed(2) +"%"

"2.45%"

 

 

解决方案:

方法一: 通过 toFixed(num)方法来保留小数。因为这个方法是根据四舍五入来保留小数的,所以最后的计算结果不精确。

(1.0-0.9).toFixed(digits)  // toFixed() 精度参数须在 0 与20 之间(digits是精确的小数点后的位数) 

parseFloat((1.0-0.9).toFixed(10)) === 0.1 // 结果为True 

parseFloat((1.0-0.8).toFixed(10)) === 0.2 // 结果为True 

parseFloat((1.0-0.7).toFixed(10)) === 0.3 // 结果为True 

parseFloat((11.0-11.8).toFixed(10)) === -0.8 // 结果为True 

parseFloat((2.22 + 0.1).toFixed(10)) ===2.23 //结果为True 

方法二:把要计算的数字升级(乘以10n次幂)成计算机能够精确识别的整数,计算完以后再降级。具体的我没有实现过。

方法三: Math.floor( xxx * 10 ) / 10 // 精确到小数点后一位

1.11*10 

11.100000000000001 //精度不准确 

Math.floor(1.11*10)/10 // 精确到小数点后一位 

1.1 

原文地址:https://www.cnblogs.com/hightech/p/13188133.html