资讯专栏INFORMATION COLUMN

JavaScript实现 超范围的数 相加

gself / 881人阅读

摘要:问题实现字符串类型的数字相加的一个方法。总结好的,最开始提到的问题已经解决了,准确的说,文中的代码只是实现了超出范围的正整数相加,不支持负整数和小数,也许我们可以继续去做点什么。

问题

实现 字符串类型的数字 相加的一个方法。
比如:
输入 "11111111111111111""22222222222222222"
返回 "33333333333333333"

解决思路

JavaScript 能表示的最大安全整数是 9007199254740991,可以用API Number.MAX_SAFE_INTEGER 看一下

超出范围就会发生精度丢失,像这样

至于更详细的关于精度丢失的问题,推荐看这篇文章
该死的IEEE-754浮点数,说「约」就「约」,你的底线呢?以JS的名义来好好查查你

这个问题中的两个数字,都是超出范围的,所以就不能简单的把两个数字,转为Number类型,进行相加。

需要取两个数字的每一位,进行相加,大于10,就进1,把结果保存在一个字符串中。

代码
function add(a,b){
    // 保存最终结果
    var res="";
    
    // 保存两位相加的结果 和 进位值
    var c=0;
    
    // 字符串转数组
    a = a.split("");
    b = b.split("");
    
    while (a.length || b.length || c){
        // ~~ 用来把String类型 转为 Number类型
        // 把两位相加的结果 和 进位值相加
        c += ~~a.pop() + ~~b.pop();
        
        // 取余,把余数拼接到最终结果中
        res = c % 10 + res;
        
        // 保存进位,true 或者 false
        c = c>9;
    }
    return res;
}
add("11111111111111111","22222222222222222");
解释

1、~ 是JavaScript中的操作符,按位非,~~ 经常用来进行取整和类型转换,他和显示的用Number进行类型转换还是有区别的,比如处理 undefined 的时候。

而在两个大整数,长度不一样的时候,其中一个数 已经 pop 了所有数组中的元素之后,还要pop的话,就会返回 undefined ,所以如果用 Number 显示的转化,起码要写成这样。

var ai = a.pop();
ai = ai===undefined? 0:Number(ai);

var bi = b.pop();
bi = bi===undefined? 0:Number(bi);

c += ai + bi;

明显是用 ~~ 方便。

2、在保存进位值的时候,用的并不是 1 和 0 ,而是true 和 false,这是因为隐式类型转换的时候,true会转为1,false会转为0。

总结

好的,最开始提到的问题已经解决了,准确的说,文中的代码只是实现了 超出范围的正整数相加,不支持负整数和小数,也许我们可以继续去做点什么。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107729.html

相关文章

  • JavaScript 精度丢失问题

    摘要:排除直接使用的数太大或太小超出范围,出现这种问题的情况基本是浮点数的小数部分在转成二进制时丢失了精度,所以我们可以将小数部分也转换成整数后再计算。 // 1. 两数相加 // 0.1 + 0.2 = 0.30000000000000004 // 0.7 + 0.1 = 0.7999999999999999 // 0.2 + 0.4 = 0.6000000000000001 // 2.2...

    iOS122 评论0 收藏0
  • JS JavaScript实现杨辉三角

    摘要:实现杨辉三角观察这样的一组数,找出规律,用控制台输出这样规律的数规律这是杨辉三角,每一行头尾的数都是,其余的数是上一行对应的数字相加,考虑使用递归算法。答案参考第一个数为最后一个数为中间的数为前一行的两个数相加用来放第行的数字符串形式输出 JS JavaScript实现杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6...

    yuanxin 评论0 收藏0
  • JS中如何理解浮点数?

    摘要:本文通过介绍的二进制存储标准来理解浮点数运算精度问题,和理解对象的等属性值是如何取值的,最后介绍了一些常用的浮点数精度运算解决方案。浮点数精度运算解决方案关于浮点数运算精度丢失的问题,不同场景可以有不同的解决方案。 本文由云+社区发表 相信大家在平常的 JavaScript 开发中,都有遇到过浮点数运算精度误差的问题,比如 console.log(0.1+0.2===0.3)// fa...

    bang590 评论0 收藏0
  • leetcode从罗马数字开始

    摘要:将罗马数字转化为十进制数字上的一道简单级别的题目将罗马数字转化为对应的十进制数字,其中罗马数字的范围在这题的关键在于了解需求,及如何将罗马数字转化为对应的十进制数字罗马数字转化为十进制数字的规则为用作数字的罗马字母共有七个,即相同的数字连写 将罗马数字转化为十进制数字 Leetcode上的一道简单级别的题目将罗马数字转化为对应的十进制数字,其中罗马数字的范围在1~3999 这题的关键在...

    LiveVideoStack 评论0 收藏0
  • js常见算法(二):从给定的无序、不重复的数组 A 中,取出 N 个数,使其相加和 为 M

    摘要:背包问题从给定的无序不重复的数组中,取出个数,使其相加和为这个算法有很多扩展,比如电商中购物车中的计算,满减,不满会在热销商品中进行推荐填充。 背包问题:从给定的无序、不重复的数组 A 中,取出 N 个数,使其相加和 为 M 这个算法有很多扩展,比如电商中购物车中的计算,满100减20,不满100会在热销商品中进行推荐填充。 function getCombBySum(array,su...

    testbird 评论0 收藏0

发表评论

0条评论

gself

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<