js如何实现大数的运算?

对于非常大或非常小的数,可以用科学记数法表示浮点值。采用科学记数法,可以把一个数表示为数字加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]
时间: 2024-11-08 20:18:41

js如何实现大数的运算?的相关文章

hdu4927 Series 1(组合+公式 Java大数高精度运算)

题目链接: Series 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 423    Accepted Submission(s): 146 Problem Description Let A be an integral series {A1, A2, . . . , An}. The zero-order series o

转:JS日期加减,日期运算

原文 出处http://hi.baidu.com/tonlywang/item/685fba8933a2a756e73d1950 一.日期减去天数等于第二个日期 function cc(dd,dadd) ...{ //可以加上错误处理 var a = new Date(dd) a = a.valueOf() a = a - dadd * 24 * 60 * 60 * 1000 a = new Date(a) alert(a.getFullYear() + "年" + (a.getMon

Acdream 1210 Chinese Girls&#39; Amusement(大数模板运算 + 找规律)

传送门 Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You must have heard that the Chinese culture is quite different from that of Europe or Rus

js 时间函数 及相关运算大全

js 时间函数 及相关运算大全 var myDate = new Date(); myDate.getYear();        //获取当前年份(2位) myDate.getFullYear();    //获取完整的年份(4位,1970-????) myDate.getMonth();       //获取当前月份(0-11,0代表1月) myDate.getDate();        //获取当前日(1-31) myDate.getDay();         //获取当前星期X(0-

大数高精度运算(模板)

前言:高精度运算.是指參与运算的数(加数.减数,因子--)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算. 模板:包含大数加减乘除.大数与int数的乘法,模板能够不断扩充. 代码: /* 所有亲測可用,可是不能用于负数的运算,仅仅能对正数进行大数运算 */ const int ten[4]= {1,10,100,1000}; const int maxl = 300; struct BigNumber { int d[maxl]; char s[maxl]; BigNumber(co

js Memoization 针对cpu密集型运算 提高运行速度

项目中需要用到 大计算量 耗时的js运算. js是单线程模型 ,优点是异步操作,对于nodejs来说可以处理高并发的任务. 但对密集型的cpu运算,异步解决不了问题,正确的来说还是该新开个线程处理. 对前端开发来说 执行大计算量 耗时的js运算   不仅会阻塞ui线程 从而导致浏览器进入僵死状态,崩溃,同时部分浏览器还会跳弹窗询问是否停止 执行的脚本. 前端 有基于HTML5 的web workers 创建新的线程 本来是考虑用 web workers .但是  两方面 1  新开的线程 不能操

大数各种运算

大数模板l #include<iostream> #include<cstring> #include<iomanip> #include<algorithm> #include<cstdio> using namespace std; #define MAXN 9999 #define MAXSIZE 10 #define DLEN 4 struct BigNum { int a[500]; //可以控制大数的位数 int len; //大数长

大数的运算

C++中,int占用4字节,32比特,数据范围为-2147483648~2147483647[-2^31~2^31-1]. uint型为无符号32位整数,占4个字节,取值范围在0~4,294,967,295之间. 但是如果需要计算的数据比这个范围更大呢?使用long ,long long ?但是如果数据更大呢?如何进行大数的计算. 通常这个情况下我们会使用string来对数据进行运算.从而达到对这个庞大的数字进行操作. //模拟加法的运算 string add(string num1, stri

js switch判断 三目运算 while 及 属性操作

三 目运算:如var a = 10: var b= 12: c = a>b ?a:b; 若成立执行a否则执行b var isHide = true; 若用if判断语句如下 if(isHide) { box.style.display = "block"; } else { box.style.display = "none"; } 三目运算替代if box.style.display = isHide?"block":"none&