js实现高精度加减乘除模板的示例代码
高精度加法
我们一起来模拟一下小学的时候我们怎么算加法的,如 298 + 67
- 先个位相加:8 + 7 = 15,个位结果是5,十位进位为1
- 再十位相加:9 + 6 = 15, 十位得到5,再加上个位的进位,得到结果是6,向百位进位为1
- 最后百位相加:2 + 1(进位)= 3
得到答案是365
代码
大整数相加一般会超过我们存储的最大位数,所以我们一般用字符串来存储。
我们每次都是从个位开始计算,所以采用倒序遍历的方式
function add(a , b) { let res = ""; // 用tmp来表示进位信息 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'; // 结果 res += tmp % 10; // 得到进位,下一次循环中,会直接加上上次的进位数 tmp = Math.floor(tmp / 10); } if(tmp) res += tmp; return res.split('').reverse().join(''); } let res = add("298 ","67"); console.log(res)
高精度减法
模拟一下减法运算,如 171 - 29
- 先个位相减: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]; // 如果是负数就借位再取余 res += (t + 10) % 10; // t < 0 表示有借位 if(t < 0) t = 1; else t = 0; } // 去除前导0,如69-69,只保留最后一个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"))
高精度乘法
注意:我们这里的高精度乘法,指的是一个高精度的数a和低精度的数b相乘,所以我们使用字符串存储a,b是一般的数字类型
如:78*66 我们可以将66看成一个整体,如果对66看出一个整体不太理解的,可以模拟计算一下 78 * 6
- 8*6 = 48 个位为 48 % 10 = 8,进位为48 / 10 = 4
- 7*6 = 42 个位为42 % 10 = 2 + 上次的进位4 = 6,并进位42 / 10 = 4
- 答案为468
将b看出一个整体,计算方法其实是一样的
代码
function mul(a, b) { let t = 0; let res = ""; for(let i = a.length - 1; i >= 0; i--) { // 加上上一次的进位,初始化t = 0 t += +a[i]*b; res += t % 10; // 保留进位 t = Math.floor(t / 10); } if(t) res += t; // 去除前导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))
高精度除法
和高精度乘法同理,也是一个高精度的数a和低精度的数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))
到此这篇关于js实现高精度加减乘除模板的示例代码的文章就介绍到这了,更多相关js实现高精度加减乘除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
动态的改变IFrame的高度实现IFrame自动伸展适应高度
动态的改变IFrame的高度,实现IFrame自动伸展,父页面也自动神缩原理: 在IFrame子页面一加载的时候,调用父IFrame对象,改变其高度2012-12-12Js判断参数(String,Array,Object)是否为undefined或者值为空
在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为空。如果是普通表单的字符串数据,只需要在 trim 后判断 length 即可,而这里需要的数据可以是各种不同的类型,通过 JSON.stringify(data) 进行序列化后再传递2013-11-11
最新评论