解决JavaScript浮点数计算时出现的误差


解决JavaScript浮点数计算时出现的误差

JavaScript 浮点数计算时,因为精度问题,会出现误差,下边就是解决误差的方法:

                /**
                 * 用来进行小数位浮点数据相加数据出现误差的加减方法
                 * @param {*} num1 
                 * @param {*} num2 
                 * @param {*} way 1 为加法,0 为减法。默认为加法
                 */
             function  filterCalcNum(num1, num2, way = 1) {
                    let sq1, sq2, multiple;
                    try {
                        sq1 = num1.toString().split(".")[1].length;
                    } catch (e) {
                        sq1 = 0;
                    }
                    try {
                        sq2 = num2.toString().split(".")[1].length;
                    } catch (e) {
                        sq2 = 0;
                    }
                    multiple = Math.pow(10, Math.max(sq1, sq2) + 1);
                    if (way) {
                        return (num1 * multiple + num2 * multiple) / multiple;
                    } else {
                        return (this.filterCalcMulNum(num1, multiple) - this.filterCalcMulNum(num2, multiple)) / multiple;
                    }
            },
 
       /**
         * 解决浮点数乘法时,有误差问题
         * @param {*} num1 
         * @param {*} num2 
         * @param {*} way  1, 乘法,2 除法 
         * @returns 
         */
     function  filterCalcMulNum(num1, num2, way = 1) {
            let s1, s2, m = 0,
                r1, r2, t1, t2;
            s1 = num1.toString();
            s2 = num2.toString();

            try {
                m += s1.split(".")[1].length
                t1 = s1.split(".")[1].length;
            } catch (e) {
                sq1 = 0;
            }
            try {
                m += s2.split(".")[1].length
                t2 = s2.split(".")[1].length
            } catch (e) {
                sq2 = 0;
            }

            if (way) {
                return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
            } else {
                r1 = Number(num1.toString().replace(".", ""))
                r2 = Number(num2.toString().replace(".", ""))
                return (r1 / r2) * Math.pow(10, t2 - t1);
            }
        },

相关