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]
代码如上了,是不是也很简单呢。