<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Energy of Love  
    日歷
    <2009年11月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345
    統計
    • 隨筆 - 70
    • 文章 - 0
    • 評論 - 80
    • 引用 - 0

    導航

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

     
    最近在做一個工資核算的系統,所有的運算全部在前臺進行,因此用了的是JS來做。
    做完以后,經手工核算,發現一個奇怪的問題。就是JS算出來的結果跟用計算器算出來的結果有差距。
    想了很久,也沒有想出問題出在哪里。
      問題這樣的:
      37.5*5.5=206.08  (JS算出來是這樣的一個結果,我四舍五入取兩位小數)
      我先懷疑是四舍五入的問題,就直接用JS算了一個結果為:206.08499999999998
      怎么會這樣,兩個只有一位小數的數字相乘,怎么可能多出這么小數點出來。
      我Google了一下,發現原來這是JavaScript浮點運算的一個bug。
      比如:7*0.8 JavaScript算出來就是:5.6000000000000005

      網上找到了一些解決辦法,就是重新寫了一些浮點運算的函數。
      下面就把這些方法摘錄下來,以供遇到同樣問題的朋友參考:
      
       程序代碼
    //除法函數,用來得到精確的除法結果
    //說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。
    //調用:accDiv(arg1,arg2)
    //返回值:arg1除以arg2的精確結果
    function accDiv(arg1,arg2){
        var t1=0,t2=0,r1,r2;
        try{t1=arg1.toString().split(".")[1].length}catch(e){}
        try{t2=arg2.toString().split(".")[1].length}catch(e){}
        with(Math){
            r1=Number(arg1.toString().replace(".",""))
            r2=Number(arg2.toString().replace(".",""))
            return (r1/r2)*pow(10,t2-t1);
        }
    }

    //給Number類型增加一個div方法,調用起來更加方便。
    Number.prototype.div = function (arg){
        return accDiv(this, arg);
    }

    //乘法函數,用來得到精確的乘法結果
    //說明:javascript的乘法結果會有誤差,在兩個浮點數相乘的時候會比較明顯。這個函數返回較為精確的乘法結果。
    //調用:accMul(arg1,arg2)
    //返回值:arg1乘以arg2的精確結果
    function accMul(arg1,arg2)
    {
        var m=0,s1=arg1.toString(),s2=arg2.toString();
        try{m+=s1.split(".")[1].length}catch(e){}
        try{m+=s2.split(".")[1].length}catch(e){}
        return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
    }

    //給Number類型增加一個mul方法,調用起來更加方便。
    Number.prototype.mul = function (arg){
        return accMul(arg, this);
    }

    //加法函數,用來得到精確的加法結果
    //說明:javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的加法結果。
    //調用:accAdd(arg1,arg2)
    //返回值:arg1加上arg2的精確結果
    function accAdd(arg1,arg2){
        var r1,r2,m;
        try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
        try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
        m=Math.pow(10,Math.max(r1,r2))
        return (arg1*m+arg2*m)/m
    }

    //給Number類型增加一個add方法,調用起來更加方便。
    Number.prototype.add = function (arg){
        return accAdd(arg,this);
    }



      在你要用的地方包含這些函數,然后調用它來計算就可以了。
      比如你要計算:7*0.8 ,則改成 (7).mul(8)
      其它運算類似,就可以得到比較精確的結果。
    posted on 2009-11-26 20:33 不高興 閱讀(756) 評論(0)  編輯  收藏 所屬分類: HTML/JS/CSS
     
    Copyright © 不高興 Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 国产成A人亚洲精V品无码| 四虎免费在线观看| 美女扒开尿口给男人爽免费视频 | 亚洲精品国产专区91在线| 中国一级特黄的片子免费 | av片在线观看永久免费| 亚洲av无码天堂一区二区三区 | 免费精品一区二区三区第35| 免费大片黄手机在线观看 | 国产精品va无码免费麻豆| 亚洲人成色7777在线观看| 亚洲视频免费观看| 97免费人妻无码视频| 亚洲国产天堂久久久久久| 一级做a爰全过程免费视频毛片| 日产国产精品亚洲系列| 亚洲综合激情视频| 97免费人妻无码视频| 亚洲综合av一区二区三区不卡 | 日本一区二区在线免费观看| 免费jjzz在线播放国产| 国产成人亚洲综合无| 亚洲高清成人一区二区三区| 成在人线av无码免费高潮水| 国产∨亚洲V天堂无码久久久| **一级毛片免费完整视| 亚洲一区二区无码偷拍| 国产传媒在线观看视频免费观看| 高清免费久久午夜精品| 亚洲国产精品久久久久婷婷老年| 国产成人精品免费视频网页大全 | 免费观看91视频| 亚洲人xxx日本人18| mm1313亚洲精品国产| 99精品视频免费观看| 亚洲精品国产av成拍色拍| 国产成人综合亚洲AV第一页| 91免费国产自产地址入| 一级成人a做片免费| 亚洲日本国产精华液| 亚洲Av无码乱码在线观看性色 |