zoukankan      html  css  js  c++  java
  • 解决javascript加减乘除及toFixed的误差问题

    原理介绍:

    https://juejin.cn/post/6844903974336724999

     

    小数计算误差

    1. 先乘以小数点位数,计算后再除以位数
    2. 转字符串
    //加法
    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 (Math.round(arg1*m)+Math.round(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));
        n=(r1>=r2)?r1:r2;
        return ((arg1*m-arg2*m)/m).toFixed(n);
    }
    //乘法
    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 accMul((r1/r2),pow(10,t2-t1));
        }
    }

    toFixed() xx.5误差

    //toFixed精度解决
    Number.prototype.toFixed = function(s) {
        var changenum=(parseInt(this * Math.pow( 10, s ) + 0.5)/ Math.pow( 10, s )).toString();
        var index=changenum.indexOf(".");
        if(index<0&&s>0){
            changenum=changenum+".";
            for(i=0;i<s;i++){
                changenum=changenum+"0";
            }
    
        }else {
            index=changenum.length-index;
            for(i=0;i<(s-index)+1;i++){
                changenum=changenum+"0";
            }
    
        }
        return changenum;
    }
     
  • 相关阅读:
    Revit 二次开发参照属性
    存储过程分页 (多条件拼接)
    Dapper的使用
    C#实现简单的邮件发送
    ORM 简介
    Web Services简介
    事物、锁、存储过程
    游标和触发器简介
    ASP.NET 上传文件方法
    C# Web API 实现上传功能
  • 原文地址:https://www.cnblogs.com/porter/p/15095104.html
Copyright © 2011-2022 走看看