当前位置: 首页 > news >正文

JS 大整数相加

在JavaScript中处理大整数相加时,由于JavaScript的Number类型是基于IEEE 754标准的双精度64位浮点格式,它只能安全地表示从-(2^53 - 1)到2^53 - 1(大约是-9007199254740991到9007199254740991)之间的整数。超出这个范围的整数在进行加法运算时可能会失去精度,导致不正确的结果。

解决方案

1. 使用字符串进行大数运算

对于大整数的加法,你可以将数字转换为字符串,然后逐字符相加,最后将结果转换回数字。

function bigSum(a, b){let maxLen = Math.max(a.length, b.length);//最大数的位数a = a.toString().padStart(maxLen, '0').split('');//转换成相同位数,位数不足就在字符串开头处补0b = b.toString().padStart(maxLen, '0').split('');//位数相同后再转成数组let result = ''let carry = 0;//每次相加后的个位数for (let i = maxLen -1; i >= 0; i--) {const sum = +a[i] + +b[i] + carry;const r = sum % 10;//得到单位数,比如相加结果为14 > 10, 就取个位 4carry = sum >= 10 ? 1 : 0;//得到进位,结果 > 10, 往前进1result = r + result;// 拼接结果}if (carry) {result = carry + result;//如果加到最后第一位还有进位,拼接到结果前面}return result;},console.log(this.bigSum('123456', '1234567'))//1,358,023
或者
function addLargeNumbers(num1, num2) {let result = '';let carry = 0;num1 = num1.split('');num2 = num2.split('');while (num1.length || num2.length || carry) {carry += (num1.pop() || 0) + (num2.pop() || 0);result = (carry % 10) + result;carry = Math.floor(carry / 10);}return result;
}console.log(addLargeNumbers('12345678901234567890', '98765432109876543210'));
2. 使用BigInt

BigInt类型,它可以用来安全地表示任意大小的整数。使用BigInt可以避免因超出安全整数范围而导致的精度丢失问题。

function addBigInts(num1, num2) {return BigInt(num1) + BigInt(num2);
}console.log(addBigInts('12345678901234567890', '98765432109876543210')); // 使用字符串初始化BigInt
// 或者直接使用数字字面量加上n后缀来创建BigInt
console.log(addBigInts(12345678901234567890n, 98765432109876543210n));

使用BigInt是处理大整数加法的推荐方法,因为它不仅解决了精度问题,还保持了操作的简洁性和性能。注意:BigInt和常规的Number类型不能混合使用,必须都转换为BigInt类型才能进行运算。

总结

  • 对于需要精确表示非常大整数的场景,推荐使用BigInt

  • 如果需要手动处理字符串形式的数字(例如,当数字非常大以至于无法直接使用BigInt时),可以手动实现大数加法算法。但通常来说,直接使用BigInt是最简单且最有效的方法。

相关文章:

  • Matlab自学笔记六十:符号表达式的缩写和简化
  • VitePress搭建静态博客
  • 一文汇总电子电气架构的成本优化方向
  • 关于华为Pura70Pro+升级鸿蒙NEXT和回退
  • 艾立泰数字化重塑汽车零部件包装租赁行业
  • Chromium 136 编译指南 macOS篇:编译优化技巧(六)
  • 【Linux学习笔记】进程间通信之共享内存
  • C# SolidWorks二次开发-实战2,解决SolidWorks2024转step文件名乱码问题
  • 从二维到三维:ArcGIS Pro与Aerialod联合制作三维人口密度分布图
  • Vue2 day04
  • xlsx-style 插件批量导出多个sheet表格excel中遇到的问题及解决
  • 微服务链路追踪在生产环境问题定位中的实战经验
  • Windows电脑数据恢复终极指南:从原理到实战
  • 七层网络模型与电脑通信比喻
  • 基于 Docker 的服务部署探索(Day 2)
  • 从语言到生态:编程语言在各行业的应用格局与未来演进
  • 编程语言的设计之道:从底层控制到表达自由
  • SPL 实践系列:跨库移植 SQL
  • redis如何使用IO多路复用
  • 【C++项目】基于IPV4的流媒体广播
  • 购物网站 购物车界面如何做/推广赚钱app
  • 网站建设小知识/百度关键词搜索推广
  • 自己做网站开发如何找客户/宁波网站推广网站优化
  • 视频模板网站/公众号运营收费价格表
  • 做虚拟货币交易网站/五种关键词优化工具
  • 网站站内搜索怎么做/百度提交入口的注意事项