解决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;
		}
	}
	//计算需要乘的数值
	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的最大小数位次幂,得出最终结果。

新方案请点击下方链接

解决js中小数相加损失精度的问题

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值