JS 大数相加

大家先看一个例子:

JS 大数相加_第1张图片

出现这样是为什么呢?

因为JavaScript 里的数字是采用 IEEE 754 标准的 64 位双精度浮点数,该规范定义了浮点数的格式,对于64位的浮点数在内存中的表示,最高的1位是符号位,接着的11位是指数,剩下的52位为有效数字,具体如下:

如图(网上找的,如有冒犯,立马删除):

JS 大数相加_第2张图片

  • 第0位:符号位, s 表示 ,0表示正数,1表示负数;
  • 第1位到第11位:储存指数部分, e 表示 ;
  • 第12位到第63位:储存小数部分(即有效数字),f 表示;

 而JS一系列的上下限如下图:

JS 大数相加_第3张图片

 所以,就造成了精度丢失,两个大数相加无法正确显示。

解决方案

解决方案就是转为字符串相加,如下代码:

function add (str1, str2) {
	str1=str1.split("");
	str2=str2.split("");
	let result="";//结果
	let flag=0;
	while(str1.length||str2.length||flag){
		flag+=~~str1.pop()+~~str2.pop();
		result=flag%10+result;
		flag=flag>9;
	}
    return result.replace(/^0+/, '');
};

其实万变不离其宗,就是咱们小学学过的加减法,满10进1,接下来就1行1行分析下吧。

第一行和第二行,就是转为数组,为的就是利用数组的方法pop()一个个对应相加。

第二行,定义一个字符串,为的就是转换为字符串相加。

第三行,就是满10进1,还是不满10进0

第四行,就是判断两个数组相加完没有,注意这里的flag,是为了防止最后一次相加为10,需要进1的情况。

第五行,这里用到了按位取反运算符(~),这里用到这个为了解决~~undefined==0,因为[].pop()==undefined,而这里falg就是解决满10进1还是满10进0;

第六行,这个,举个例子,5+7=13;13%10=1....3;而这里就是先把3加上

第七行,这个是利用了隐形转为,falg转为1或者0,为了表示进1或进0。

也有到这里,有些同学还不太懂,接下来咱们就测试下,看下结果


add("1213123323213125","32131231231232132136")//32132444354555345261
//第一轮
//flag=flag(0)+5+6
//result=11%10(1)+""   result="1"
//flag=11>9     flag=1  这里就是进满10进1
//第二轮
//flag=1+3+2 
//result=6%10(6)+"1"    result="61"
//flag=6>9   flag=0  //不满10进0
//.......  

我相信这样应该理解了吧,如果还不理解的同学,可以打debugger,走几遍就懂了。

最后谢谢大家的查阅。。。

你可能感兴趣的:(算法初体验)