JS中小数相加存在的精度问题
JavaScript代码
- console.log(0.1+0.2);//0.30000000000000004
- console.log(0.2+0.7);//0.8999999999999999
解决办法
JavaScript代码
- <script>
- // 精确乘法计算
- function FloatMul(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) {}
- var result = (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) / Math.pow(10, m);//将两个数扩大对应的小数位数倍转换成数字类型在相乘,乘完再除于对应的扩大倍数得到最终结果
- return isNaN(result) ? 0 : result;
- }
- //获得两个小数相加的精确值
- const accountAdd = (arg1, arg2) => {
- let 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));//取出得到的最长位数,将10扩大最长位数倍
- return (FloatMul(arg1, m) + FloatMul(arg2, m)) / m;
- };
- let sum = accountAdd(2.3443, -1.987);
- console.log(sum);//0.3573
- </script>