计算两个数值字符串的和,返回字符串。(跨越数值类型的上限,两个大数不限于正负和含小数相加,使用字符串模拟相加过程)

复制代码
//两个大数相加(包含正负,小数点),使用字符串模拟相加过程 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 欢迎指错,吐槽,谢谢!
 
posted @   威尔逊  阅读(492)  评论(0编辑  收藏  举报
编辑推荐:
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示