解决js中⼩数相加损失精度的问题
⾸先来看⼀段代码:
console.log(0.1+0.2);//0.30000000000000004
console.log(0.1+0.7);//0.7999999999999999
在上⾯的代码中,很明显可以看出,浏览器计算出来的数据,跟我们预期的数据不⼀样,怎样解决这种由于进制存储造成的误差呢? 请看下⾯的代码
//定义⼀个加法函数
function add(){
var args = arguments,//获取所有的参数
lens = args.length,//获取参数的长度
d = 0,//定义⼩数位的初始长度,默认为整数,即⼩数位为0
sum = 0,//定义sum来接收所有数据的和
//循环所有的参数
for(var key in args){//遍历所有的参数
//把数字转为字符串
var str = ""+args[key];
if(str.indexOf(".")!=-1){//判断数字是否为⼩数
//获取⼩数位的长度
var temp = str.split(".")[1].length;
//⽐较此数的⼩数位与原⼩数位的长度,取⼩数位较长的存储到d中
d = d < temp ? temp : d;js arguments
}
}
/
/计算需要乘的数值
var m = Math.pow(10,d);
//遍历所有参数并相加
for(var key in args){
sum += args[key]*m;
}
//返回结果
return sum/m;
}
console.log(add(0.1,0.2));//0.3
console.log(add(0.1,0.7));//0.8
综上所述:可以得到我们预期的结果。
思路总结:
1.遍历所有相加的数的最⼤⼩数位
2.所有数乘以10的最⼤⼩数位次幂,把⼩数变成整数,再相加
3.所得数的总和再除以10的最⼤⼩数位次幂,得出最终结果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。