<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
    統(tǒng)計(jì)
    • 隨筆 - 70
    • 文章 - 0
    • 評(píng)論 - 80
    • 引用 - 0

    導(dǎo)航

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

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

      網(wǎng)上找到了一些解決辦法,就是重新寫了一些浮點(diǎn)運(yùn)算的函數(shù)。
      下面就把這些方法摘錄下來,以供遇到同樣問題的朋友參考:
      
       程序代碼
    //除法函數(shù),用來得到精確的除法結(jié)果
    //說明:javascript的除法結(jié)果會(huì)有誤差,在兩個(gè)浮點(diǎn)數(shù)相除的時(shí)候會(huì)比較明顯。這個(gè)函數(shù)返回較為精確的除法結(jié)果。
    //調(diào)用:accDiv(arg1,arg2)
    //返回值:arg1除以arg2的精確結(jié)果
    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類型增加一個(gè)div方法,調(diào)用起來更加方便。
    Number.prototype.div = function (arg){
        return accDiv(this, arg);
    }

    //乘法函數(shù),用來得到精確的乘法結(jié)果
    //說明:javascript的乘法結(jié)果會(huì)有誤差,在兩個(gè)浮點(diǎn)數(shù)相乘的時(shí)候會(huì)比較明顯。這個(gè)函數(shù)返回較為精確的乘法結(jié)果。
    //調(diào)用:accMul(arg1,arg2)
    //返回值:arg1乘以arg2的精確結(jié)果
    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類型增加一個(gè)mul方法,調(diào)用起來更加方便。
    Number.prototype.mul = function (arg){
        return accMul(arg, this);
    }

    //加法函數(shù),用來得到精確的加法結(jié)果
    //說明:javascript的加法結(jié)果會(huì)有誤差,在兩個(gè)浮點(diǎn)數(shù)相加的時(shí)候會(huì)比較明顯。這個(gè)函數(shù)返回較為精確的加法結(jié)果。
    //調(diào)用:accAdd(arg1,arg2)
    //返回值:arg1加上arg2的精確結(jié)果
    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類型增加一個(gè)add方法,調(diào)用起來更加方便。
    Number.prototype.add = function (arg){
        return accAdd(arg,this);
    }



      在你要用的地方包含這些函數(shù),然后調(diào)用它來計(jì)算就可以了。
      比如你要計(jì)算:7*0.8 ,則改成 (7).mul(8)
      其它運(yùn)算類似,就可以得到比較精確的結(jié)果。
    posted on 2009-11-26 20:33 不高興 閱讀(756) 評(píng)論(0)  編輯  收藏 所屬分類: HTML/JS/CSS
     
    Copyright © 不高興 Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 欧美色欧美亚洲另类二区| 亚洲欧洲国产成人精品| 亚洲激情在线观看| 亚洲电影在线播放| 亚洲成av人片在线天堂无| 黄网站色视频免费观看45分钟| 精品国产污污免费网站入口| 91精品国产免费久久国语蜜臀| 最近的中文字幕大全免费版| mm1313亚洲精品国产| 亚洲电影国产一区| 亚洲日韩一区二区一无码| 一级黄色免费网站| 久久久免费精品re6| 免费精品一区二区三区在线观看| 久久久久久亚洲精品不卡| 久久精品亚洲中文字幕无码麻豆| 亚洲熟妇AV一区二区三区浪潮 | a级午夜毛片免费一区二区| 久久久久久一品道精品免费看| 女人毛片a级大学毛片免费| 亚洲精品国自产拍在线观看| 亚洲网站在线免费观看| 亚洲av成本人无码网站| a毛片在线看片免费| 日韩视频在线免费观看| 亚洲第一AAAAA片| 亚洲欧美中文日韩视频| 免费看成人AA片无码视频吃奶| 黄色成人网站免费无码av| 亚洲一区二区三区在线视频| 亚洲校园春色另类激情| 一级毛片不卡免费看老司机 | 免费观看成人久久网免费观看| 男人的好免费观看在线视频| 国产亚洲精品拍拍拍拍拍| 亚洲一区二区三区高清不卡| a成人毛片免费观看| 午夜电影免费观看| 亚洲自偷自偷精品| 永久免费无码网站在线观看个|