js浮点数计算精度问题,可能无法完全避免计算误差

修改之后的加法

  function accAdd(curr, next) {
        var curr_l, next_l, m, c;
        // 首选获取两个参数小数点后面位数,方便转换成整数。
        try {
            curr_l = curr.toString().split(".")[1].length;
        }
        catch (e) {
            curr_l = 0;
        }
        try {
            next_l = next.toString().split(".")[1].length;
        }
        catch (e) {
            next_l = 0;
        }
        c = Math.abs(curr_l - next_l); // 返回一个数字的绝对值,返回差之为正数
        m = Math.pow(10, Math.max(curr_l, next_l)); //取10的n次方,取小数点后面位数最大的那个n次方
        console.log(c,curr_l,next_l,m)
        if (c > 0) { // 如果curr 和 next小数点后面位数不一样
            // 计算两个参数,转换为整数之后,位数差。编码两个参数相加,个数和十位数对映不上,从而进位。
            var cm = Math.pow(10, c);
            /*
            * cm 比较curr, next参数小数点后面位数
            * 1.如果第一个大于第二个,则第二个参数需要进位
            * 2.如果第二个大于第一个,则第一个参数需要进位
            * 示例:122.113、110.1 相加,122 与 110 百位、十位、个位一一对应;
            * 转换为整数之后分别是 122113、 1101,变成,2113 与 1101 百位、十位、个位对应上了,相加会有问题。
            * 此时我们把1101乘以100,变成 110100 与 122113,就满足百位、十位、个位一一对应上了,此时相加问题解决。
            * */
            if (curr_l > next_l) {
                curr = Number(curr.toString().replace(".", ""));
                next = Number(next.toString().replace(".", "")) * cm;
            } else {
                curr = Number(curr.toString().replace(".", "")) * cm;
                next = Number(next.toString().replace(".", ""));
            }
        } else {
            curr = Number(curr.toString().replace(".", ""));
            next = Number(next.toString().replace(".", ""));
        }
        // 计算完结果,把整数还原成小数。
        return (curr + next) / m;
    }

修改之后的减法

function accSub(curr, next) {
        var curr_l, next_l, m, c;
        try {
            curr_l = curr.toString().split(".")[1].length;
        }
        catch (e) {
            curr_l = 0;
        }
        try {
            next_l = next.toString().split(".")[1].length;
        }
        catch (e) {
            next_l = 0;
        }
        c = Math.abs(curr_l - next_l);
        m = Math.pow(10, Math.max(curr_l, next_l));
        if (c > 0) {
            var cm = Math.pow(10, c);
            if (curr_l > next_l) {
                curr = Number(curr.toString().replace(".", ""));
                next = Number(next.toString().replace(".", "")) * cm;
            } else {
                curr = Number(curr.toString().replace(".", "")) * cm;
                next = Number(next.toString().replace(".", ""));
            }
        } else {
            curr = Number(curr.toString().replace(".", ""));
            next = Number(next.toString().replace(".", ""));
        }
        return (curr- next) / m;
    }
    //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
  }

修改之后的乘法

function accMul(curr,next){
        var m=0,s1=curr.toString(),s2=next.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(curr, next) { //去小数点,扩大倍数,再乘以相应倍数
        var t1 = 0, t2 = 0, curr_l, next_l;
        try {
            t1 = curr.toString().split(".")[1].length;
        }
        catch (e) {
        }
        try {
            t2 = next.toString().split(".")[1].length;
        }
        catch (e) {
        }
        curr_l = Number(curr.toString().replace(".", ""));
        next_l = Number(next.toString().replace(".", ""));
        return (curr_l / next_l) * pow(10, t2 - t1);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值