JavaScript实现大数的运算


Posted in Javascript onNovember 24, 2014

对于非常大或非常小的数,可以用科学记数法表示浮点值。采用科学记数法,可以把一个数表示为数字加e/E,后面加乘以10的倍数,如:

var num1 = 3.125e7; // 31250000 var num2 = 3e-17; // 0.00000000000000003

进行特别大的数的加减运算,可以使用字符串+科学记数法的方法来进行,如:

// 这里只考虑大整数的情况,不考虑小数 function strAdd(sNum1, sNum2){ 

  /*增加一位数位以记录最高位进一的情况*/

  var sNum1 = ['0', sNum1].join(''), sNum2 = ['0', sNum2].join(''); 

   /*给短的数字字符串加补0*/

  var len1 = sNum1.length, len2 = sNum2.length, 

    zeroArr = function(len){ 

      var arr = new Array(len), i=len; 

      while(i--){arr[i] = 0;} 

      return arr; 

    }; 

   if(len1 > len2){ 

    var arrTemp = zeroArr(len1 - len2); 

    arrTemp.push(sNum2), 

    sNum2 = arrTemp.join(''); 

  } 

  else if(len2 > len1){ 

    var arrTemp = zeroArr(len2 - len1); 

    arrTemp.push(sNum1), 

    sNum1 = arrTemp.join(''); 

  } 

    /*将字符串转换为数组,以相应数位来相加*/

  var arr1 = sNum1.split(''), arr2 = sNum2.split(''); 

   var arrAddRes = new Array(arr1.length), i=arr1.length; 

   var andone = 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位如果有,用科学记数法来表示这个结果*/

  var keeplen = 19; // js的小数只保留小数点后的18位   var eAfter = arrAddRes.length - 1; // e后面的倍数部分   var eBefore, 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]

代码如上了,是不是也很简单呢。

Javascript 相关文章推荐
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
jquery实现加载等待效果示例
Sep 25 Javascript
Jquery api 速查表分享
Jan 12 Javascript
深入学习JavaScript中的Rest参数和参数默认值
Jul 28 Javascript
对jQuary选择器的全面总结
Jun 20 Javascript
微信小程序  checkbox组件详解及简单实例
Jan 10 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 jQuery
vue2.0 keep-alive最佳实践
Jul 06 Javascript
bootstrap Table服务端处理分页(后台是.net)
Oct 19 Javascript
vue+webpack实现异步组件加载的方法
Feb 03 Javascript
Element-ui DatePicker显示周数的方法示例
Jul 19 Javascript
javascript实现点击星星小游戏
Dec 24 Javascript
使表格的标题列可左右拉伸jquery插件封装
Nov 24 #Javascript
jQuery实现隔行背景色变色
Nov 24 #Javascript
jQuery实现统计复选框选中数量
Nov 24 #Javascript
基于jQuery实现文本框缩放以及上下移动功能
Nov 24 #Javascript
基于jQuery实现复选框的全选 全不选 反选功能
Nov 24 #Javascript
基于jQuery实现下拉框
Nov 24 #Javascript
基于jQuery实现表单提交验证
Nov 24 #Javascript
You might like
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
js判断密码强度的方法
2020/03/18 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
[03:19]2016国际邀请赛中国区预选赛第四日TOP10镜头集锦
2016/07/01 DOTA
[01:07:41]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python标准库之随机数 (math包、random包)介绍
2014/11/25 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
python+django+rest框架配置创建方法
2019/08/31 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
使用Python pip怎么升级pip
2020/08/11 Python
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
读书心得体会
2013/12/28 职场文书
排查整治工作方案
2014/06/09 职场文书
商务经理岗位职责
2014/07/30 职场文书
教师个人年终总结
2015/02/11 职场文书
交心谈心活动总结
2015/05/11 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
小学体育教学随笔
2015/08/14 职场文书
干部理论学习心得体会
2016/01/21 职场文书
竞聘开场白方式有哪些?
2019/08/28 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
sqlserver2017共享功能目录路径不可改的解决方法
2021/04/16 SQL Server
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript