JS运算精度丢失

一、遇到得问题:

0.1+0.2 = 0.30000000000000004
在这里插入图片描述

二、产生原因:

因为在输入内容进行转换的时候,二进制转换成十进制然后十进制转换成字符串,在这个转换的过程中发生了取近似值,所以打印出来的是一个近似值。

三、解决办法(重写计算方法)

/*
* 重写 加减乘除 运算法则 保留精度
* */
class MathTools {
    
    
    // 加
     floatAdd(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 (floatMultiply(arg1 , m) + floatMultiply(arg2 , m)) / m;
    }

// 减
     floatSub(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 ((floatMultiply(arg1 , m) - floatMultiply(arg2 , m)) / m).toFixed(n);
    }

// 乘
     floatMultiply(arg1, arg2) {
    
    
        if(arg1 == null || arg2 == null){
    
    
            return null;
        }
        var n1,n2;
        var r1, r2; // 小数位数
        try {
    
    
            r1 = arg1.toString().split(".")[1].length;
        } catch (e) {
    
    
            r1 = 0;
        }
        try {
    
    
            r2 = arg2.toString().split(".")[1].length;
        } catch (e) {
    
    
            r2 = 0;
        }
        console.log(r1);
        console.log(r2);
        n1 = Number(arg1.toString().replace(".", ""));
        n2 = Number(arg2.toString().replace(".", ""));
        console.log(Math.pow(10, r1+r2));
        console.log(n1*n2);
        return n1 * n2 / Math.pow(10, r1+r2);
    }

// 除
     floatDivide(arg1, arg2) {
    
    
        if(arg1 == null){
    
    
            return null;
        }
        if(arg2 == null || arg2 == 0){
    
    
            return null;
        }
        var n1,n2;
        var r1, r2; // 小数位数
        try {
    
    
            r1 = arg1.toString().split(".")[1].length;
        } catch (e) {
    
    
            r1 = 0;
        }
        try {
    
    
            r2 = arg2.toString().split(".")[1].length;
        } catch (e) {
    
    
            r2 = 0;
        }
        n1 = Number(arg1.toString().replace(".", ""));
        n2 = Number(arg2.toString().replace(".", ""));
        return (n1 / n2) * Math.pow(10, r2 - r1);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33839972/article/details/118494785