专栏首页FEWYJavaScript实现 超范围的数 相加

JavaScript实现 超范围的数 相加

问题

实现 字符串类型的数字 相加的一个方法。 比如: 输入 '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('');

    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。

总结

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小程序—九宫格心形拼图

    感觉很有趣,就上网查了查怎么做,大部分的说法就是用美图秀秀的拼图功能来做, 在微信小程序中也有专门做心形拼图的小程序,我都试了试之后,感觉还可以更加简单一些,于...

    FEWY
  • 获取页面中被选中元素的 JS原生方法 与 jQuery方法 分析

    补充 然而说到获取属性,我们一定会想到getAttribute() 方法,返回值是属性的值 或者 null,但是这个方法来获取checked属性的值,并...

    FEWY
  • 简单说 通过CSS实现 文字渐变色 的两种方式

    版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn...

    FEWY
  • ASM 翻译系列第二十弹:ASM Internal ASM file number 7

    原作者:Bane Radulovic 译者: 郭旭瑞 审核: 魏兴华 DBGeeK社群联合出品 ASM file number 7 ASM元信息7号...

    沃趣科技
  • 「小程序JAVA实战」小程序的关注功能(65)

    PS:关注跟点赞类似也是操作后端的几张表来完成的,重点是前端需要判断状态,来进行显示对应的按钮,其实小程序把逻辑都给了前端。data里面的操作灵活的运用,业务逻...

    IT故事会
  • form表单中带有文件上传,同时提交

    唐怀瑟
  • ansible自动运维工具之ansible-playbook详解

    playbook文件定义的任务需要通过ansible-playbook命令进行调用并执行,ansible-playbook命令用法如下:

    小手冰凉
  • 实战分布式之电商高并发秒杀场景总览

    本文是新系列“实战高并发”的开篇作。这个系列作为“我说分布式”的子系列,将着重挑选若干典型的分布式实战场景,尽量对当下高并发领域较为热门的架构及业务场景做一次较...

    AI乔治
  • 【春招】【腾讯止步总监面/附京东网易游戏面试题】

    牛客网
  • python 通过元类控制类的创建

    在上面这张图中,A是我们平常在python中写的类,它可以创建一个对象a。其实A这个类也是一个对象,它是type类的对象,可以说type类是用来创建类对象的类,...

    py3study

扫码关注云+社区

领取腾讯云代金券