フロントエンドエンタープライズインタビューの質問:実際のエンタープライズケース39

大きな数を計算する方法は?

通常の考え方は、数値を文字列に変換することを検討し、各ビットを計算することです

例として加算を見てみましょう:

let add = function(num1, num2) {
  // 将短的数字长度补齐,左侧补0
  let len = Math.abs(num1.length-num2.length);
  let bu = "";
  for(let i=0; i<; i++){
    bu += "0";
  }
  // 将短的数字长度补齐,左侧补0
  if(num1.length>num2.length) {
    num2 = bu + num2;
  } else if(num1.length<num2.length){
    num1 = bu + num1;
  } 
  
  let bit = 0;  //相加后的进位,第一次计算时默认为0
  let result = ''; //保存累加的结果
  let temp = 0;  //临时计算结果
  for(let i=num1.length-1; i>=0;  i--){
    //计算该位相加结果,把之前的进位也计算进来
    temp = bit + Number(num1[i]) + Number(num2[i]);
    //将相加结果对10求余,累加到结果中
    result = (temp%10) + result; 
    //将相加结果除以10取整,得到进位数
    bit = parseInt(temp/10)
  }
  //当每一位都相加完毕, 判断bit是否进位
  //若有进位,则在整体结果前再加1
  return result = (bit === 1 ? '1' : '') + result;
}

 

ES2020の新しい仕様では、大きな型bigIntがあります。

//在整数字面量后面加n。
var bigIntNum = 9007199254740993n;

//使用 BigInt 函数。
var bigIntNum = BigInt(9007199254740);
var anOtherBigIntNum = BigInt('9007199254740993');

//通过 BigInt, 我们可以安全的进行大数整型计算
var bigNumRet = 9007199254740993n+ 9007199254740993n; //  18014398509481986n
bigNumRet.toString(); //  '18014398509481986'

おすすめ

転載: blog.csdn.net/GUDUzhongliang/article/details/108624711