前端企业面试题:企业真实案例——39
程序员文章站
2022-06-04 14:49:55
...
大数计算如何实现?
通常的思路是考虑将数字转换为字符串,然后再每一位进行计算
我们以加法为例:
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'