解决JS中计算出现无限小数位问题

原因分析:

在项目中遇到了浮点数转换为百分数的问题,用浮点数乘以100结果产生了一堆小数位。查资料发现原因是由于计算机计算会先把数字转换成二进制计算,然后在转换为10进制,导致精度丢失。


解决方案:

对一些方法进行了封装

1. 加法

方法中主要的部分是乘数和最后return的算法,如果不用封装的话,可以自己写一个比较大的数字,比如100000000,先把两个加数分别乘以这个数,这样也可以计算正确,除非你知道你的数字范围,否则不建议这样做。

function add (num1, num2) {
	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return false;
	var r1 = 0, r2 = 0;
	try {
  		r1 = num1.toString().split(".")[1].length;
	} catch (e) {
	}
	try {
  		r2 = num2.toString().split(".")[1].length;
	} catch (e) {
	}
	var n = Math.pow(10, Math.max(r1, r2));
	return (num1 * n + num2 * n) / n;
}
// 测试一下
addition(306994.91, 306994.91);
// 控制台输出:613989.82

2. 减法

减法运算的原理和加法一样,都是先乘以较大的数字。

function sub(num1, num2) {  
	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
	var r1 = 0, r2 = 0;
	try {
  		r1 = num1.toString().split(".")[1].length;
	} catch (e) {
	}
	try {
  		r2 = num2.toString().split(".")[1].length;
	} catch (e) {
	}
	var m = Math.pow(10, Math.max(r1, r2));
  		return (num1 * m - num2 * m) / m;
}

3. 乘法

乘法的计算主要是将数字转换为整数相乘再除以10的N次幂

function mul(num1, num2) { 
	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return; 
	var m = 0, s1 = num1.toString(), s2 = num2.toString();
	try {
  		m += s1.split(".")[1].length
	} catch (e) {
	}
	try {
	   m += s2.split(".")[1].length
	} catch (e) {
	}
	return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}

4. 除法

除法的计算主要是先转整型进行计算再除以10的N次幂

function div(arg1, arg2) {
	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
	var t1 = 0, t2 = 0, r1, r2;
	try {
		t1 = arg1.toString().split(".")[1].length
	} catch (e) {
	}
	try {
		t2 = arg2.toString().split(".")[1].length
	} catch (e) {
	}
	r1 = Number(arg1.toString().replace(".", ""));
	r2 = Number(arg2.toString().replace(".", ""));
	return (r1 / r2) * Math.pow(10, t2 - t1);
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值