• 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>
  • 相关阅读:
    CF493D Vasya and Basketball (二分)
    CF734C Anton and Making Potions (二分)
    CF785C Anton and Fairy Tale (二分)
    HDU3047 Zjnu Stadium (带权并查集)
    POJ1795 DNA Laboratory (状压dp)
    BZOJ.3524.[POI2014]Couriers(主席树)
    BZOJ.3932.[CQOI2015]任务查询系统(主席树 差分)
    洛谷.3835.[模板]可持久化平衡树(fhq treap)
    SDOI2013 R1 Day2
    洛谷.3919.[模板]可持久化数组(可持久化线段树/平衡树)
  • 原文地址:https://www.cnblogs.com/lipengze/p/11428679.html
Copyright © 2020-2023  润新知