【數據小常識】“四舍六入五成雙”


“四舍六入五成雙”規則如下:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM