【数据小常识】“四舍六入五成双”
“四舍六入五成双”规则如下:
“四舍六入五成双”,也即“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
js的Number.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"
js的Math.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
方法二:把要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,计算完以后再降级。具体的我没有实现过。
方法三: Math.floor( xxx * 10 ) / 10 // 精确到小数点后一位
1.11*10
11.100000000000001 //精度不准确
Math.floor(1.11*10)/10 // 精确到小数点后一位
1.1