JS 實(shí)現(xiàn)兩個(gè)大數(shù)相加鳄逾?
當(dāng)有兩個(gè)整數(shù) a 和 b 摊灭,在通常情況下我們有“+”運(yùn)算符對(duì)其進(jìn)行相加運(yùn)算:
let sum = a + b;
但是 JS 在存放整數(shù)的時(shí)候是有一個(gè)安全范圍的楷怒,一旦數(shù)字超過(guò)這個(gè)范圍便會(huì)損失精度。
我們不能拿精度損失的數(shù)字進(jìn)行運(yùn)行羡宙,因?yàn)檫\(yùn)算結(jié)果一樣是會(huì)損失精度的。
所以付枫,我們要用字符串來(lái)表示數(shù)據(jù)E胗瘛(不會(huì)丟失精度)
JS 中整數(shù)的最大安全范圍可以查到是:9007199254740991
假如我們要進(jìn)行 9007199254740991 + 1234567899999999999
我們要先準(zhǔn)備兩個(gè)字符串變量和一個(gè)方法:
let a = "9007199254740991";
let b = "1234567899999999999";
function add(a ,b){
//...
}
然后將字符串長(zhǎng)度對(duì)齊:
let a = "9007199254740991";
let b = "1234567899999999999";
function add(a ,b){
//取兩個(gè)數(shù)字的最大長(zhǎng)度
let maxLength = Math.max(a.length, b.length);
//用0去補(bǔ)齊長(zhǎng)度
a = a.padStart(maxLength , 0);//"0009007199254740991"
b = b.padStart(maxLength , 0);//"1234567899999999999"
}
然后從個(gè)位開(kāi)始相加:
let a = "9007199254740991";
let b = "1234567899999999999";
function add(a ,b){
//取兩個(gè)數(shù)字的最大長(zhǎng)度
let maxLength = Math.max(a.length, b.length);
//用0去補(bǔ)齊長(zhǎng)度
a = a.padStart(maxLength , 0);//"0009007199254740991"
b = b.padStart(maxLength , 0);//"1234567899999999999"
//定義加法過(guò)程中需要用到的變量
let t = 0;
let f = 0; //"進(jìn)位"
let sum = "";
for(let i=maxLength-1 ; i>=0 ; i--){
t = parseInt(a[i]) + parseInt(b[i]) + f;
f = Math.floor(t/10);
sum = t%10 + sum;
}
if(f == 1){
sum = "1" + sum;
}
return sum;
}
運(yùn)行:
add(a ,b); //結(jié)果為:1243575099254740990