关于JS数字精度丢失的解决办法

本文深入探讨了JavaScript中数字运算的精度丢失问题,并提供了一种详细的解决方案,通过自定义操作函数处理加、减、乘、除运算,确保计算结果的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于JS数字精度丢失的解决办法


关于数字计算的解决方案

var operationNumber = function (arg1,arg2,operator) {
    var oper=['+','-','*','/'];
    // 不合法的运算
    if (isNaN(arg1)||isNaN(arg2)||oper.indexOf(operator)<0) {
        return NaN;
    }
    // 除以0
    if (operator==='/'&&Number(arg2)===0) {
        return Infinity;
    }
    // 和0相乘
    if (operator==='*'&&Number(arg2)===0) {
        return 0;
    }
    // 相等两个数字相减
    if ((arg1===arg2||Number(arg1)===Number(arg2))&&operator==='-') {
        return 0;
    }
    var r1, //小数位数
     r2, //小数位数
     max,_r1,_r2;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    max = Math.max(r1, r2)
    _r1 = max-r1;
    _r2 = max-r2;
    if (_r1!==0) {
        arg1=arg1+'0'.repeat(_r1)
    }//arg1小数位少,少几位数,则用0补齐
    if (_r2!==0) {
        arg2=arg2+'0'.repeat(_r2)
    } //arg2小数位少
    arg1 = Number(arg1.toString().replace('.',''))//去掉小数点
    arg2 = Number(arg2.toString().replace('.',''))//去掉小数点
    var r3 = operator==='*'?(max*2):(operator==='/'?0:max); //要去掉的位数
    var newNum = eval(arg1+operator+arg2);
    if (r3!==0) {
        var nStr = newNum.toString();
        nStr = nStr.replace(/^-/,'');
        if (nStr.length<r3+1) {
            nStr = '0'.repeat(r3+1-nStr.length)+nStr;
        }
        nStr = nStr.replace(new RegExp('(\\\d{'+r3+'})$'),'.$1');
        if (newNum<0) {
            nStr = '-'+nStr;
        }
        newNum = nStr*1;
    }
    return newNum;
}
//加法 
Number.prototype.myAdd = function(arg2) {
    return operationNumber(this,arg2,'+');
}
//减法 
Number.prototype.mySub = function(arg2) {
    return operationNumber(this,arg2,'-');
}
//乘法 
Number.prototype.myMul = function(arg2) {
    return operationNumber(this,arg2,'*');
}
// 除法
Number.prototype.myDiv = function(arg2) {
    return operationNumber(this,arg2,'/');
}

原文链接: 点击跳转.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值