//两个大数相加(包含正负,小数点),使用字符串模拟相加过程 javascript实现
function fnPlus(a,b){
if(isNaN(a)||isNaN(b)){alert("不是数值类型!"); return false;}
var aSign=1;if(a.indexOf("-")!=-1){aSign=-1;a=a.replace("-","")};//记录正负
var bSign=1;if(b.indexOf("-")!=-1){bSign=-1;b=b.replace("-","")};
if(a.indexOf(".")==-1){a+=".0";}//兼容小数点
if(b.indexOf(".")==-1){b+=".0";}
var gap=a.length-a.indexOf(".")-b.length+b.indexOf(".");//小数位数相差位数记录
var arr_a=a.split("").reverse();//整数数组
var arr_b=b.split("").reverse();
var clonea=arr_a.slice(0);
var cloneb=arr_b.slice(0);
var res="";
var carryValue=0;
var ax,bx,plusx;
var max=(a.length>b.length?a.length:b.length);
//^判断最终结果的正负
var isNegative=false;
var aGb=0;
for(j=max-1;j>=0;j--){
var az=(typeof(arr_a[j+gap])=="undefined"?0:Number(arr_a[j+gap]));
var bz=(typeof(arr_b[j])=="undefined"?0:Number(arr_b[j]));
if(az>bz)
{aGb=1;break;}else if(az<bz){aGb=0;break;}
}
if(aSign>0&&bSign<0){
aGb==1?isNegative=false:isNegative=true;
} else if(aSign<0&&bSign>0){
aGb==1?isNegative=true:isNegative=false;
}else if(aSign<0&&bSign<0){
isNegative=true;
}else if(aSign>0&&bSign>0){
isNegative=false;
}
//$
var upEnd=max+Math.abs(gap);
for(i=0;i<=upEnd;i++){
if(arr_b[i]=="."){res="."+res;}else{
ax=typeof(arr_a[i+gap])=="undefined"?0:aSign*arr_a[i+gap];
bx=typeof(arr_b[i])=="undefined"?0:bSign*arr_b[i];
plusx=Number(ax)+Number(bx)+Number(carryValue);
carryValue=Number(plusx.toString().substring(0,plusx.length-1));
if(isNegative&&plusx>0) {carryValue++;plusx=plusx-10} ;//
if(!isNegative&&plusx<0) {carryValue--;plusx=plusx+10}
plusx=plusx.toString();
res=plusx.substring(plusx.length-1,plusx.length)+res;
}
}
return (isNegative?"-":"")+res.replace(/^\-0+/gi,"").replace(/^0+/gi,"").replace(/\.0+$/gi,"");
}
fnPlus("-12111111111111111111111111111111111111111111111111111111111111111.33","1121.000000000000000000000000000000000000000000000000008")
结果:"-12111111111111111111111111111111111111111111111111111111111109990.329999999999999999999999999999999999999999999999992"
fnPlus("-121.33","1121.000000000000000000000000000000000000000000000000008")
结果:"999.670000000000000000000000000000000000000000000000008"
fnPlus("-121","1121")
结果:"1000"
由于数值类型针对长数据串加减会溢出,所以全部用字符串去模拟加减,并返回字符串类型。
步骤主要是先判断最终结果的正负,再循环累加,每一位相加结果与最终结果的负号不一致则从上以为借一位转换成10中和掉这部分,使之与结果的正负匹配。
QQ:9708508 欢迎指错,吐槽,谢谢!