“四舍六入五成雙”規則如下:
“四舍六入五成雙”,也即“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