<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        Javascript中toFixed計(jì)算錯誤(依賴銀行家舍入法的缺陷)解決方法

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:31:59
        文檔

        Javascript中toFixed計(jì)算錯誤(依賴銀行家舍入法的缺陷)解決方法

        Javascript中toFixed計(jì)算錯誤(依賴銀行家舍入法的缺陷)解決方法:前言 在公司項(xiàng)目中涉及到一個有大量浮點(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é)尾的四舍
        推薦度:
        導(dǎo)讀Javascript中toFixed計(jì)算錯誤(依賴銀行家舍入法的缺陷)解決方法:前言 在公司項(xiàng)目中涉及到一個有大量浮點(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é)尾的四舍

        前言

        在公司項(xiàng)目中涉及到一個有大量浮點(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é)尾的四舍五入錯誤問題;

        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í)這個所謂的銀行家舍入法,證實(shí)分為三種情況,分別以4、5、6為舍入位對toFixed的證實(shí)(以chrome為例):

        以4為舍入位:

        var num = 0.004;
        console.log(num.toFixed(2));
        0.00
        var num = 0.014;
        console.log(num.toFixed(2));
        0.01
        var num = 0.094;
        console.log(num.toFixed(2));
        0.09
        

        在4結(jié)尾這種情況下toFixed表現(xiàn)的還算不錯,并沒有錯誤的問題。

        以6為舍入位:

        var num = 0.006;
        console.log(num.toFixed(2));
        0.01
        var num = 0.016;
        console.log(num.toFixed(2));
        0.02
        var num = 0.096;
        console.log(num.toFixed(2));
        0.10

        以6結(jié)尾這種情況下toFixed表現(xiàn)的也不錯,并沒有錯誤的問題。

        以5為舍入位:

        5后非零:

        var num = 0.0051;
        console.log(num.toFixed(2));
        0.01
        var num = 0.0052;
        console.log(num.toFixed(2));
        0.01
        var num = 0.0059;
        console.log(num.toFixed(2));
        0.01

        根據(jù)規(guī)則,五后非零就進(jìn)一,我們證實(shí)并沒有任何的問題。

        以5為舍入位:

        5后為零: 由于這種情況比較特殊,是toFixed方法出現(xiàn)計(jì)算錯誤的情況,所以我進(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
        0.06
        0.07
        0.08
        0.09
        0.10

        可以看出Ie11下正常,其余瀏覽器下均出現(xiàn)錯誤。雖然并不完全符合銀行家舍入法的規(guī)則,我認(rèn)為是由于二進(jìn)制下浮點(diǎn)數(shù)的坑導(dǎo)致了不完全符合該規(guī)則。

        總而言之:不論引入toFixed解決浮點(diǎn)數(shù)計(jì)算精度缺失的問題也好,它有沒有使用銀行家舍入法也罷,都是為了解決精度的問題,但是又離不開二進(jìn)制浮點(diǎn)數(shù)的環(huán)境,但至少他幫助我們找到了問題所在,從而讓我們有解決方法。

        解決方法

        下面我提供一種通過重寫toFixed的方法:

         Number.prototype.toFixed = function(length)
         {
         var carry = 0; //存放進(jìn)位標(biāo)志
         var num,multiple; //num為原浮點(diǎn)數(shù)放大multiple倍后的數(shù),multiple為10的length次方
         var str = this + ''; //將調(diào)用該方法的數(shù)字轉(zhuǎn)為字符串
         var dot = str.indexOf("."); //找到小數(shù)點(diǎn)的位置
         if(str.substr(dot+length+1,1)>=5) carry=1; //找到要進(jìn)行舍入的數(shù)的位置,手動判斷是否大于等于5,滿足條件進(jìn)位標(biāo)志置為1
         multiple = Math.pow(10,length); //設(shè)置浮點(diǎn)數(shù)要擴(kuò)大的倍數(shù)
         num = Math.floor(this * multiple) + carry; //去掉舍入位后的所有數(shù),然后加上我們的手動進(jìn)位數(shù)
         var result = num/multiple + ''; //將進(jìn)位后的整數(shù)再縮小為原浮點(diǎn)數(shù)
         /*
         * 處理進(jìn)位后無小數(shù)
         */
         dot = result.indexOf(".");
         if(dot < 0){
         result += '.';
         dot = result.indexOf(".");
         }
         /*
         * 處理多次進(jìn)位
         */
         var len = result.length - (dot+1);
         if(len < length){
         for(var i = 0; i < length - len; i++){
         result += 0;
         }
         }
         return result;
         }
        

        該方法的大致思路是首先找到舍入位,判斷該位置是否大于等于5,條件成立手動進(jìn)一位,然后通過參數(shù)大小將原浮點(diǎn)數(shù)放大10的參數(shù)指數(shù)倍,然后再將包括舍入位后的位數(shù)利用floor全部去掉,根據(jù)我們之前的手動進(jìn)位來確定是否進(jìn)位。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Javascript中toFixed計(jì)算錯誤(依賴銀行家舍入法的缺陷)解決方法

        Javascript中toFixed計(jì)算錯誤(依賴銀行家舍入法的缺陷)解決方法:前言 在公司項(xiàng)目中涉及到一個有大量浮點(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é)尾的四舍
        推薦度:
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲人成在线精品| 久久亚洲国产精品成人AV秋霞| 性xxxx黑人与亚洲| 免费精品国产自产拍在| 亚洲成年人免费网站| 免费毛片a在线观看67194| 国产99在线|亚洲| 啦啦啦www免费视频| 久久精品国产亚洲av天美18| 日本免费观看网站| 一级毛片免费观看不收费| 中文字幕亚洲乱码熟女一区二区| 成在线人视频免费视频| 亚洲综合色婷婷七月丁香| 日韩电影免费在线观看中文字幕 | 伊在人亚洲香蕉精品区麻豆| 污视频网站免费观看| 亚洲色无码专区在线观看| 日本在线看片免费| 亚洲愉拍一区二区三区| 亚洲国产激情一区二区三区| 男女拍拍拍免费视频网站| 久久久无码精品亚洲日韩蜜桃| 成人免费大片免费观看网站| 亚洲AV综合色区无码一二三区 | 免费看AV毛片一区二区三区| 黄色网址大全免费| 亚洲AV永久无码区成人网站| 日本免费网站视频www区| 无码天堂亚洲国产AV| 亚洲va国产va天堂va久久| 最近2019中文免费字幕| 国产99视频精品免费视频76| 亚洲精彩视频在线观看| 四虎永久免费影院在线| 国产在线一区二区综合免费视频| 国产成人亚洲精品| 亚洲精品无码AV人在线播放| 最近中文字幕无免费视频| 在线观看肉片AV网站免费| 亚洲色成人网站WWW永久四虎|