前端处理 小数相乘 精度问题以及 保留两位小数

示例: accMul(1,2)
//两位小数 相乘
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)
}
//两位小数 相除
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); //—整数相除 在乘上10的平方 小数点的长度
}
}
//两位小数 相加
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
}
//两位小数 相减
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 ((arg1m-arg2m)/m).toFixed(n);
}

//保留两位小数
dealJineNum2(2.333,2,true)
function dealJineNum2(num , digits, isRound){
var digits = 2;
var isRound = true;

 // 是否为正数
var isPositive = (+num >= 0);
num += '';

isRound = Boolean(isRound);
// 去掉正负号,统一按照正数来处理,最后再加上符号
num = num.replace(/^(?:-|\+)/gi, '');

// 小数点过大
/* istanbul ignore next */
if (digits > 20 || digits < 0) {
    throw new RangeError('toFixed() digits argument must be between 0 and 20');
}

// 如果是简写如.11则整数位补0,变成0.11
/* istanbul ignore next */
if (/^\./gi.test(num)) {
    num = '0' + num;
}

// 非数字
/* istanbul ignore next */
if (!/^\d+\.?\d*$/gi.test(num)) {
    throw new Error('toFixed() num argument must be a valid num');
}

var numParts = num.split('.');
var result = '';
var floatPart = '';

// 在str后面加n个0
var _paddingZero = function (str, n) {
    for (var i = 0; i < n; i++) {
        str += '0';
    }
    return str;
};

// 在str后面加0,直至str的长度达到n
// 如果超过了n,则直接截取前n个字符串
var _paddingZeroTo = function (str, n) {
    if (str.length >= n) {
        return str.substr(0, n);
    } else {
        return _paddingZero(str, n - str.length);
    }
};

// 直接就是整数
if (numParts.length < 2) {
    result = numParts[0] + '.' + _paddingZero('', digits);
    // 为浮点数
} else {
    // 如果为截取
    if (isRound === false) {
        result = numParts[0] + '.' + _paddingZeroTo(numParts[1], digits);
        // 如果为四舍五入
    } else {
        // 放大10的N次方倍
        var enlarge = numParts[0] + _paddingZeroTo(numParts[1], digits) + '.' + numParts[1].substr(digits);
        // 取整
        enlarge = Math.round(enlarge) + '';
        // 缩小10的N次方
        while(enlarge.length <= digits){
            enlarge = '0' + enlarge;
        }
        result = enlarge.substr(0, enlarge.length - digits) + '.' + enlarge.substr(enlarge.length - digits);
    }
}

// 如果最后一位为.,则去除
result = result.replace(/\.$/gi, '').replace(/^\./gi, '0.');

// 加上符号位
result = isPositive ? result : '-' + result;
return result;

};

发布了7 篇原创文章 · 获赞 2 · 访问量 230

猜你喜欢

转载自blog.csdn.net/qq_40630064/article/details/103167564