js實(shí)現(xiàn)高精度加減乘除模板的示例代碼
高精度加法
我們一起來(lái)模擬一下小學(xué)的時(shí)候我們?cè)趺此慵臃ǖ模?298 + 67
- 先個(gè)位相加:8 + 7 = 15,個(gè)位結(jié)果是5,十位進(jìn)位為1
- 再十位相加:9 + 6 = 15, 十位得到5,再加上個(gè)位的進(jìn)位,得到結(jié)果是6,向百位進(jìn)位為1
- 最后百位相加:2 + 1(進(jìn)位)= 3
得到答案是365
代碼
大整數(shù)相加一般會(huì)超過(guò)我們存儲(chǔ)的最大位數(shù),所以我們一般用字符串來(lái)存儲(chǔ)。
我們每次都是從個(gè)位開(kāi)始計(jì)算,所以采用倒序遍歷的方式
function add(a , b) {
? ?let res = "";
? ?// 用tmp來(lái)表示進(jìn)位信息
? ?let tmp = 0;
? ?for(let i = a.length - 1, j = b.length - 1; i >= 0|| j >= 0; i--,j--) {
? ? ? ?if (i >= 0) tmp += a[i] - '0';
? ? ? ?if (j >= 0) tmp += b[j] - '0';
? ? ? ?// 結(jié)果
? ? ? ?res += tmp % 10;
? ? ? ?// 得到進(jìn)位,下一次循環(huán)中,會(huì)直接加上上次的進(jìn)位數(shù)
? ? ? ?tmp = Math.floor(tmp / 10);
? }
? ?if(tmp) res += tmp;
? ?return res.split('').reverse().join('');
}
?
let res = add("298 ","67");
console.log(res)
高精度減法
模擬一下減法運(yùn)算,如 171 - 29
- 先個(gè)位相減:1 - 9 需要向十位借位得11 - 9 = 2
- 十位相減:7 - 1(借位) - 2 = 4
- 百位 1 - 0 = 1
答案是142
代碼
function sub(a, b) {
? ?let t = 0;
? ?let res = "";
? ?for(let i = a.length - 1, j = b.length - 1; i >= 0|| j >= 0; i--,j--) {
? ? ? ?// 先減去上一次的借位,t初始化為0
? ? ? ?if(i >= 0) t = +a[i] - t;
? ? ? ?if(j >= 0) t -= +b[j];
? ? ? ?// 如果是負(fù)數(shù)就借位再取余
? ? ? ?res += (t + 10) % 10;
? ? ? ?
? ? ? ?// t < 0 表示有借位
? ? ? ?if(t < 0) t = 1;
? ? ? ?else t = 0;
? }
? ?// 去除前導(dǎo)0,如69-69,只保留最后一個(gè)0即可
? ?while(res[res.length - 1] === '0' && res.length > 1) res = res.slice(0,res.length - 1);
? ?return res.split('').reverse().join('');
}
?
console.log(sub("5432117","2119"))
高精度乘法
注意:我們這里的高精度乘法,指的是一個(gè)高精度的數(shù)a和低精度的數(shù)b相乘,所以我們使用字符串存儲(chǔ)a,b是一般的數(shù)字類型
如:78*66 我們可以將66看成一個(gè)整體,如果對(duì)66看出一個(gè)整體不太理解的,可以模擬計(jì)算一下 78 * 6
- 8*6 = 48 個(gè)位為 48 % 10 = 8,進(jìn)位為48 / 10 = 4
- 7*6 = 42 個(gè)位為42 % 10 = 2 + 上次的進(jìn)位4 = 6,并進(jìn)位42 / 10 = 4
- 答案為468
將b看出一個(gè)整體,計(jì)算方法其實(shí)是一樣的
代碼
function mul(a, b) {
? ?let t = 0;
? ?let res = "";
? ?for(let i = a.length - 1; i >= 0; i--) {
? ? ? ?// 加上上一次的進(jìn)位,初始化t = 0
? ? ? ?t += +a[i]*b;
? ? ? ?res += t % 10;
? ? ? ?// 保留進(jìn)位
? ? ? ?t = Math.floor(t / 10);
? }
? ?if(t) res += t;
? ?// 去除前導(dǎo)0
? ?while(res[res.length - 1] === '0' && res.length > 1) res = res.slice(0, res.length - 1)
? ?return res.split('').reverse().join('');
}
?
console.log(mul('88',66))
高精度除法
和高精度乘法同理,也是一個(gè)高精度的數(shù)a和低精度的數(shù)b相除

代碼
function div(a,b) {
? ?const num = [];
? ?for(let i = a.length - 1; i >= 0; i--) {
? ? ? ?num.push(a[i] - '0');
? }
? ?let t = 0;
? ?let res = "";
? ?for(let i = num.length - 1; i >= 0; i--) {
? ? ? ?t = t*10 +num[i]
? ? ? ?res += Math.floor( t / b );
? ? ? ?t %= b;
? }
? ?while(res.length > 1 && res[0] === '0') res = res.slice(1,res.length)
? ?return [res,t];
}
?
console.log(div('7',2))
到此這篇關(guān)于js實(shí)現(xiàn)高精度加減乘除模板的示例代碼的文章就介紹到這了,更多相關(guān)js實(shí)現(xiàn)高精度加減乘除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript 函數(shù)的執(zhí)行過(guò)程
下面小編就為大家?guī)?lái)一篇JavaScript 函數(shù)的執(zhí)行過(guò)程。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
微信小程序用戶授權(quán)彈窗 拒絕時(shí)引導(dǎo)用戶重新授權(quán)實(shí)現(xiàn)
我們?cè)陂_(kāi)發(fā)小程序時(shí),如果想獲取用戶信息,就需要獲取用的授權(quán),如果用戶誤點(diǎn)了拒絕授權(quán),我們?cè)趺礃尤フ_的引導(dǎo)用戶重新授權(quán)呢。今天就來(lái)給大家講講如果正確的引導(dǎo)用戶授權(quán),需要的朋友可以參考下2019-07-07
js實(shí)現(xiàn)prototype擴(kuò)展的方法(字符串,日期,數(shù)組擴(kuò)展)
這篇文章主要介紹了js實(shí)現(xiàn)prototype擴(kuò)展的方法,實(shí)例分析了JavaScript針對(duì)字符串、日期、數(shù)組等的prototype擴(kuò)展相關(guān)技巧,需要的朋友可以參考下2016-01-01
javascript實(shí)現(xiàn)節(jié)點(diǎn)(div)名稱編輯
這篇文章主要介紹了js實(shí)現(xiàn)節(jié)點(diǎn)(div)名稱編輯,需要的朋友可以參考下2014-12-12
javascript檢測(cè)瀏覽器flash版本的實(shí)現(xiàn)代碼
javascript檢測(cè)瀏覽器flash版本的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-12-12
JS中appendChild追加子節(jié)點(diǎn)無(wú)效的解決方法
這篇文章主要給大家介紹了關(guān)于JS中appendChild追加子節(jié)點(diǎn)無(wú)效的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)2018-10-10
JavaScript鏈?zhǔn)秸{(diào)用實(shí)例淺析
這篇文章主要介紹了JavaScript鏈?zhǔn)秸{(diào)用,結(jié)合實(shí)例形式分析了javascript鏈?zhǔn)秸{(diào)用的相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2018-12-12
通過(guò)js來(lái)制作復(fù)選框的全選和不選效果
這篇文章主要介紹的是通過(guò)js來(lái)制作復(fù)選框的全選和不選效果,需要的朋友可以參考下2014-05-05

