
//两个大数相加(包含正负,小数点),使用字符串模拟相加过程 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 欢迎指错,吐槽,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义