js中小数运算精度丢失问题

在js中做一些计算的时候,如果直接计算有可能造成精度丢失,比如在计算1.79 + 0.12的时候,直接计算的结果就是1.9100000000000001,但是我们知道正确的计算结果应该1.91.我的解决办法如下(直接放代码)

<html>
    <body>
        <input type="button" name="name" value="xxxx" onclick="test()"/>
    </body>
    <script language="javascript">
        function add(num1,num2){
            var r1,r2,m,n;
            try{r1=num1.toString().split(".")[1].length}catch(e){r1=0}
            try{r2=num2.toString().split(".")[1].length}catch(e){r2=0}
            m = Math.pow(10,Math.max(r1,r2));
            n = (r1>=r2)?r1:r2;
            return ((num1*m + num2*m)/m).toFixed(n);
        }
        function sub(num1,num2){
            var r1,r2,m,n;
            try{r1=num1.toString().split(".")[1].length}catch(e){r1=0}
            try{r2=num2.toString().split(".")[1].length}catch(e){r2=0}
            n = (r1>=r2)?r1:r2;
            m = Math.pow(10,Math.max(r1,r2));
            return ((num1*m - num2*m)/m).toFixed(n);
        }
        function mul(num1,num2){
            var m = 0;
            try{m+=num1.toString().split(".")[1].length}catch(e){}
            try{m+=num2.toString().split(".")[1].length}catch(e){}
            return (Number(num1.toString().replace(".",""))*Number(num2.toString().replace(".","")))/Math.pow(10,m)
        }
        function div(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){}
            r1=Number(arg1.toString().replace(".",""));
            r2=Number(arg2.toString().replace(".",""));
            return (r1/r2)*Math.pow(10,t2-t1);
        }
        function test(){
            var _add = 1.79 + 0.12;
            var _add2 = add(1.79,0.12);
            var _sub = 2.01 - 0.12;
            var _sub2 = sub(2.01,0.12);
            var _mul = 1.01 * 1.3;
            var _mul2 = mul(1.01,1.3);
            var _div = 0.69 / 10;
            var _div2 = div(0.69,10);
            alert("加法:处理前1.79 + 0.12 = " +_add + "  处理后 1.79 + 0.12 = " + _add2 + "\n" +
                  "减法:处理前2.01 - 0.12 = " +_sub + "  处理后 2.01 - 0.12 = " + _sub2 + "\n" +
                  "乘法:处理前1.01 * 1.3 = " +_mul + "  处理后 1.01 * 1.3 = " + _mul2 + "\n" +
                  "除法:处理前0.69 / 10 = " +_div + "  处理后 0.69 / 10 = " + _div2 + "\n"
            );
        }
    </script>
</html>

执行结果如图
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值