去我主页看更多JS分享!
这是另一种实现方式,更加简洁和完整(之前有一个实现,所以您可以比较这个实现的代码)
一般涉及到价格的计算,比如商场的订单结算,大部分都是后端计算。
不过也会有前台的参与,不要慌。下面的代码直接解决了js的计算问题。
如果你有任何问题,请在评论区告诉我们。如果没有,就夸我们一句!
一、加法、减法
1.错误示例console . log(0.1 0.2);
//输出:0.30000000000000004,正确结果为0.3。
console.log(0.2 0.4)
//输出:0.6000000000000001,正确结果为0.6。
console . log(1.0-0.9);
//输出:0.09999999999999998,正确结果为0.1。
console . log(0.9-0.7);
//输出:0.2000000000000000007,正确结果为0.2。
2.分析
产生错误的原因是,在操作浮点数时,先将其转换为二进制,再由二进制计算,然后将结果转回十进制。简单理解js中的非整数运算会出错,下面是解决代码(建议所有非整数运算都要处理,不要直接计算)。
//加法运算
var calcPlus=(num1,num 2)={ 0
设l1、l2、m;
尝试{
l1=num1.toString()。拆分('.')[1].长度;
抓住
L1=0;
}
尝试{
l2=num2.toString()。拆分('.')[1].长度;
抓住
L2=0;
}
m=Math.pow(10,Math.max(l1,L2));
返回(num 1 * m num 2 * m)/m;
};
console.log(calcPlus(0.1,0.2));
//输出:0.3
console.log(calcPlus(0.2,0.4));
//输出:0.6
//减法运算
var calcSubtract=(num1,num 2)={ 0
设l1、l2、m;
尝试{
l1=num1.toString()。拆分('.')[1].长度;
抓住
L1=0;
}
尝试{
l2=num2.toString()。拆分('.')[1].长度;
抓住
L2=0;
}
m=Math.pow(10,Math.max(l1,L2));
返回(num 1 * m-num 2 * m)/m;
};
console.log(calcSubtract(1.0,0.9));
//输出:0.1
console.log(calcSubtract(0.9,0.7));
//输出:0.2
对比这两个代码,可以发现实现原理是一样的:
得到中间值,即两个数的最大小数位数,从10的幂转换为实际值;最后通过中间值将数字1和数字2变成整数,再通过计算后的中间值得到正确的结果。例如,0.1 0.2=(0.1 X10 0.2 X10)/10=3/10=0.3;例如,0.9-0.7=(0.9x 10-0.7x 10)/10=2/10=0.2
二、乘法
1。错误示例console . log(19.9 * 100);
//输出:19899998,正确结果是1990 . 999999999996
console . log(79.9 * 100);
//输出:7990.000000001,正确结果为7990。
2.分析
错误的原因是它被转换成二进制,然后被计算。首先粘贴代码:
//乘法运算
var calcmmultiply=(num 1,num 2)={ 0
设m=0;
尝试{
m=num1.toString()。拆分('.')[1].长度;
}捕获(e) {}
尝试{
m=num2.toString()。拆分('.')[1].长度;
}捕获(e) {}
return()num 1 . ToString()。替换('.',' '))* Number(num2.toString()。替换('.',' ')))/Math.pow(10,m);
};
console . log(calcmmultiply(19.9,100));
//输出:1990年
console.log(calcMultiply(79.9,100));
//输出:7990
实施原则:
中间值是两个数小数位数之和,由10的幂转换为实际值;从数字1和数字2中去掉小数点,即它们变成整数,再除以乘法。
以中间值,得到正确的结果;比如:19.9 * 100 => (199 * 100) / 10 = 19900 / 10 = 1990三、除法
1. 出错的例子
console.log(6.6 / 0.2); //输出:32.99999999999999,正确结果为33 console.log(99.9 / 3); //输出:33.300000000000004,正确结果为33.32. 解析
出错的原因,一样是转为二进制后再进行计算。先贴上代码:
//除法运算 var calcDivide = (num1, num2) => { let l1 = 0, l2 = 0; try { l1 = num1.toString().split(".")[1].length; } catch (e) {} try { l2 = num2.toString().split(".")[1].length; } catch (e) {} let c = Number(num1.toString().replace(".", "")) / Number(num2.toString().replace(".", "")); return calcMultiply(c , Math.pow(10, l2-l1)); }; console.log(calcDivide (6.6, 0.2)); //输出:33 console.log(calcDivide (99.9, 0.3)); //输出:333实现原理:
得到中间值,是两个数字的小数位之差,并由10的次方转换为实际的值;注意除法的除数位与被除数位是固定的,因此上面代码是l2-l1;将数字1、数字2去除小数点,即变为整数,相除后乘以中间值(调用上面的乘法的计算,因为会存在小数),得到正确的结果;比如:99.9/3 => (999 / 3) * 0.1 = 333 * 0.1 = 33.3四、拓展封装(完整代码)
上面的代码还有重复的地方,那就再进一步封装:
/** * calc.plus 加法运算 * calc.subtract 减法运算 * calc.multiply 乘法运算 * calc.divide 除法运算 */ var calc = (function () { let operation = (num1, num2, op) => { let l1, l2, max; try { l1 = num1.toString().split(".")[1].length; } catch (e) { l1 = 0; } try { l2 = num2.toString().split(".")[1].length; } catch (e) { l2 = 0; } switch (op) { case "plus": max = Math.pow(10, Math.max(l1, l2)); return (num1 * max + num2 * max) / max; case "subtract": max = Math.pow(10, Math.max(l1, l2)); return (num1 * max - num2 * max) / max; case "multiply": return (Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", ""))) / Math.pow(10, l1 + l2); case "divide": return operation(Number(num1.toString().replace(".", "")) / Number(num2.toString().replace(".", "")), Math.pow(10, l2 - l1), "multiply"); } }; let plus = (a, b) => { return operation(a, b, "plus"); }; let subtract = (a, b) => { return operation(a, b, "subtract"); }; let multiply = (a, b) => { return operation(a, b, "multiply"); }; let divide = (a, b) => { return operation(a, b, "divide"); }; return { plus, subtract, multiply, divide }; })(); console.log(0.1 + 0.2, calc.plus(0.1, 0.2)); //输出:0.30000000000000004 0.3 console.log(0.2 + 0.4, calc.plus(0.2, 0.4)); //输出:0.6000000000000001 0.6 console.log(1.0 - 0.9, calc.subtract(1.0, 0.9)); //输出:0.09999999999999998 0.1 console.log(0.9 - 0.7, calc.subtract(0.9, 0.7)); //输出:0.20000000000000007 0.2 console.log(19.9 * 100, calc.multiply(19.9, 100)); //输出:1989.9999999999998 1990 console.log(79.9 * 100, calc.multiply(79.9, 100)); //输出:7990.000000000001 7990 console.log(6.6 / 0.2, calc.divide(6.6, 0.2)); //输出:32.99999999999999 33 console.log(99.9 / 3, calc.divide(99.9, 3)); //输出:33.300000000000004 33.3如果问题,请在评论区留言!