js 부동 소수점 연산 재무 시스템 정확 한 계산

2860 단어
[toc]
배경
4. 567917. 프로젝트 에 부동 소수점, Int 등 js 를 사용 하 는데 4. 567914. 유형 이 비교적 많 고 재무 소프트웨어, 프런트 js 연산 등 과 관련된다.때로는 정확 한 문제 가 생기 기도 하고, 공공 방법 에는 좋 은 사람 이 쓰 는 방법 이 있다.참고 로.
구체 코드
여기 서 참고 하 세 요.
//       :  js     bug
function InitNumberOperation() {
    //    ,           
    //  :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);
    };
    //    
    function accSub(arg1, arg2) {
        var r1, r2, m, n;
        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));
        //last modify by deeka
        //        
        n = (r1 >= r2) ? r1 : r2;
        return ((arg2 * m - arg1 * m) / m).toFixed(n);
    }
    /// number     sub  ,        
    Number.prototype.sub = function (arg) {
        return accSub(arg, this);
    };
}

좋은 웹페이지 즐겨찾기