前言
在公司項(xiàng)目中涉及到一個(gè)有大量浮點(diǎn)數(shù)價(jià)格計(jì)算的模塊,從而引發(fā)了我一系列的思考:
計(jì)算機(jī)二進(jìn)制環(huán)境下浮點(diǎn)數(shù)的計(jì)算精度缺失問題;
console.log(.1+.2);0.30000000000000004
為了解決上述問題,使用了toFixed方法卻出現(xiàn)了浮點(diǎn)數(shù)小數(shù)位以5結(jié)尾的四舍五入錯(cuò)誤問題;
var num = 0.045;console.log(num.toFixed(2));0.04
以此為起點(diǎn),引發(fā)了我關(guān)于toFixed的一系列探索,終于找到了一些有用的信息,toFixed使用的計(jì)算規(guī)則是:
銀行家舍入:所謂銀行家舍入法,其實(shí)質(zhì)是一種四舍六入五取偶(又稱四舍六入五留雙)法。
簡單來說就是:四舍六入五考慮,五后非零就進(jìn)一,五后為零看奇偶,五前為偶應(yīng)舍去,五前為奇要進(jìn)一。
正文
下面我們就來證實(shí)這個(gè)所謂的銀行家舍入法,證實(shí)分為三種情況,分別以4、5、6為舍入位對toFixed的證實(shí)(以chrome為例):
以4為舍入位:
var num = 0.004;console.log(num.toFixed(2));0.00var num = 0.014;console.log(num.toFixed(2));0.01var num = 0.094;console.log(num.toFixed(2));0.09
在4結(jié)尾這種情況下toFixed表現(xiàn)的還算不錯(cuò),并沒有錯(cuò)誤的問題。
以6為舍入位:
var num = 0.006;console.log(num.toFixed(2));0.01var num = 0.016;console.log(num.toFixed(2));0.02var num = 0.096;console.log(num.toFixed(2));0.10
以6結(jié)尾這種情況下toFixed表現(xiàn)的也不錯(cuò),并沒有錯(cuò)誤的問題。
以5為舍入位:
5后非零:
var num = 0.0051;console.log(num.toFixed(2));0.01var num = 0.0052;console.log(num.toFixed(2));0.01var num = 0.0059;console.log(num.toFixed(2));0.01
根據(jù)規(guī)則,五后非零就進(jìn)一,我們證實(shí)并沒有任何的問題。
以5為舍入位:
5后為零: 由于這種情況比較特殊,是toFixed方法出現(xiàn)計(jì)算錯(cuò)誤的情況,所以我進(jìn)行了大量的證實(shí),且分別在常見的主流瀏覽器下進(jìn)行了測試:
以如下測試用例為例:
var num = 0.005;console.log(num.toFixed(2));var num = 0.015;console.log(num.toFixed(2));var num = 0.025;console.log(num.toFixed(2));var num = 0.035;console.log(num.toFixed(2));var num = 0.045;console.log(num.toFixed(2));var num = 0.055;console.log(num.toFixed(2));var num = 0.065;console.log(num.toFixed(2));var num = 0.075;console.log(num.toFixed(2));var num = 0.085;console.log(num.toFixed(2));var num = 0.095;console.log(num.toFixed(2));
chrome、firefox、safari、opera的結(jié)果如下:
0.01
0.01
0.03
0.04
0.04
0.06
0.07
0.07
0.09
0.10
ie11結(jié)果如下:
0.01
0.02
0.03
0.04
0.05
新聞熱點(diǎn)
疑難解答
圖片精選