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 相关文章推荐
JS如何判断移动端访问设备并解析对应CSS
Nov 27 Javascript
asp.net刷新本页面的六种方法总结
Jan 07 Javascript
jquery的each方法使用示例分享
Mar 25 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
js仿苹果iwatch外观的计时器代码分享
Aug 26 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
Feb 14 Javascript
js实现返回顶部效果
Mar 10 Javascript
MUI 上拉刷新/下拉加载功能实例代码
Apr 13 Javascript
详解Axios统一错误处理与后置
Sep 26 Javascript
使用vuepress搭建静态博客的示例代码
Feb 14 Javascript
vue实现公共方法抽离
Jul 31 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
Nov 04 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
Symfony2针对输入时间进行查询的方法分析
2017/06/28 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
2017/09/20 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
angularjs手动识别字符串中的换行符方法
2018/10/02 Javascript
详解Vue之父子组件传值
2019/04/01 Javascript
Nodejs + Websocket 指定发送及群聊的实现
2020/01/09 NodeJs
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
python学生管理系统开发
2019/01/30 Python
Python多线程threading join和守护线程setDeamon原理详解
2020/03/18 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
拉斯维加斯城市观光通行证:Las Vegas Pass
2019/05/21 全球购物
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
教育系统干部作风整顿心得体会
2014/09/09 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
学校联谊协议书
2014/09/16 职场文书
2014年司法局工作总结
2014/12/11 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
总结Python常用的魔法方法
2021/05/25 Python
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python