JavaScript实现大数的运算
对于非常大或非常小的数,可以用科学记数法表示浮点值。采用科学记数法,可以把一个数表示为数字加e/E,后面加乘以10的倍数,如:
varnum1=3.125e7;//31250000varnum2=3e-17;//0.00000000000000003
进行特别大的数的加减运算,可以使用字符串+科学记数法的方法来进行,如:
//这里只考虑大整数的情况,不考虑小数functionstrAdd(sNum1,sNum2){ /*增加一位数位以记录最高位进一的情况*/ varsNum1=['0',sNum1].join(''),sNum2=['0',sNum2].join(''); /*给短的数字字符串加补0*/ varlen1=sNum1.length,len2=sNum2.length, zeroArr=function(len){ vararr=newArray(len),i=len; while(i--){arr[i]=0;} returnarr; }; if(len1>len2){ vararrTemp=zeroArr(len1-len2); arrTemp.push(sNum2), sNum2=arrTemp.join(''); } elseif(len2>len1){ vararrTemp=zeroArr(len2-len1); arrTemp.push(sNum1), sNum1=arrTemp.join(''); } /*将字符串转换为数组,以相应数位来相加*/ vararr1=sNum1.split(''),arr2=sNum2.split(''); vararrAddRes=newArray(arr1.length),i=arr1.length; varandone=0,//低位相加是否进一 cur1,cur2,curAdd; while(i--){ cur1=+arr1[i],cur2=+arr2[i]; curAdd=cur1+cur2+andone; if(10>curAdd) arrAddRes[i]=curAdd, andone=0; else arrAddRes[i]=+curAdd.toString().slice(1,2), andone=1; } if(!andone){//最后是否进一,否则截取前面的0 arrAddRes.splice(0,1); } /*数组截取前19位如果有,用科学记数法来表示这个结果*/ varkeeplen=19;//js的小数只保留小数点后的18位 vareAfter=arrAddRes.length-1;//e后面的倍数部分 vareBefore,eBeforeStr=''; //e前面的小数部分 if(keeplen<arrAddRes.length) eBeforeStr=[arrAddRes[0],'.',arrAddRes.slice(1,keeplen).join('')].join(''); else eBeforeStr=[arrAddRes[0],'.',arrAddRes.slice(1).join('')].join(''); eBefore=+eBeforeStr; return[Number(arrAddRes.join('')),eBefore,eAfter]; } strAdd('1234567890','9876543210');//->[1111111100,1.1111111,9]
代码如上了,是不是也很简单呢。