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 函数调用模式小结
Dec 26 Javascript
谈谈关于JavaScript 中的 MVC 模式
Apr 11 Javascript
使用js正则控制input标签只允许输入的值
Jul 29 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
Oct 17 Javascript
jQuery实现图片局部放大镜效果
Mar 17 Javascript
Extjs4.0 ComboBox如何实现三级联动
May 11 Javascript
jQuery自定义数值抽奖活动代码
Jun 11 Javascript
JavaScript用200行代码制作打飞机小游戏实例
Jun 21 Javascript
简述Angular 5 快速入门
Nov 04 Javascript
js实现每日签到功能
Nov 29 Javascript
基于vue实现一个禅道主页拖拽效果
May 27 Javascript
Vue作用域插槽实现方法及作用详解
Jul 08 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
德生PL990的分析评价
2021/03/02 无线电
php arsort 数组降序排序详细介绍
2016/11/17 PHP
关于php中的json_encode()和json_decode()函数的一些说明
2016/11/20 PHP
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
零基础写python爬虫之神器正则表达式
2014/11/06 Python
python调用fortran模块
2016/04/08 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
详解django.contirb.auth-认证
2018/07/16 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
Python提取频域特征知识点浅析
2019/03/04 Python
python爬取代理ip的示例
2020/12/18 Python
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
五四青年节的活动方案
2014/08/20 职场文书
我是一名护士演讲稿
2014/08/28 职场文书
售房委托书
2014/08/30 职场文书
关于感谢信的范文
2015/01/23 职场文书
出生证明格式
2015/06/15 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js