有志者事竟成。

js 中加减乘除 比较精确的算法,js本身有些运算会出错,这里给出较精确的算法

问题这样的:
  37.5*5.5=206.08  (JS算出来是这样的一个结果,我四舍五入取两位小数)
  我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998
  怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。
  我Google了一下,发现原来这是JavaScript浮点运算的一个bug。
  比如:7*0.8 JavaScript算出来就是:5.6000000000000005

  网上找到了一些解决办法,就是重新写了一些浮点运算的函数。
  下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

<!DOCTYPE html>
<html>

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
    </head>

    <body>
        <script type="text/javascript">
            //加法函数,用来得到精确的加法结果
            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);
            }
            //乘法函数,用来得到精确的乘法结果
            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);
            }
            ///除法函数,用来得到精确的除法结果
            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);
            }
            //制保留2位小数,如:2,会在2后面补上00.即2.00 
            function toDecimal2(x) {
                var f = parseFloat(x);
                if(isNaN(f)) {
                    return false;
                }
                var f = Math.round(x * 100) / 100;
                var s = f.toString();
                var rs = s.indexOf('.');
                if(rs < 0) {
                    rs = s.length;
                    s += '.';
                }
                while(s.length <= rs + 2) {
                    s += '0';
                }
                return s;
            }

            console.log(accAdd(1.01, 1.12) + '--------加')
            console.log(accMul(1.01, 1.12) + '--------乘法')
            console.log(accDiv(1.01, 1.12) + '--------除法')
            console.log(toDecimal2(1.0569) + '---------保留2位小数')
        </script>
    </body>

</html>

 

posted on 2019-08-29 11:22  阿长*长  阅读(562)  评论(0编辑  收藏  举报

导航