Javascript如何显示完整的大数加法结果而不是科学计数法形式

对于正常的Javascript加法操作:

对于2^100在控制台进行计算并不能显示完整,上网查资料进行计算。(第一行为最终代码的计算结果,不显示科学计数法)

如何能达到计算出最上面一行呢?今天在Code wars中刷到这样一道题:

题目描述

题目地址:

https://www.codewars.com/kata/sum-strings-as-numbers

第一次尝试

从上图中可以清楚的看见,题目只是要求简单的写一个字符串数字的加法。于是我就写了一个简单的demo:

function sumStrings(a, b) {
        if (a == '') {
            return b;
        } else if (b == '') {
            return a;
        } else {
            return (parseInt(a) + parseInt(b)).toString();
        }

先转换成数字,然后计算之后进行字符串的转换并返回结果。测试结果:

但是这个题,既然是4kyu等级,绝对不可能这么简单:

图中清楚的看见,对于较大的数字,显示的是科学记数法,当然这样是不能通过测试的。

第二次尝试

为了解决这个问题,我在本地将这两个数据进行保存,并修改了代码进行计算。

function sumStrings(a, b) {
if (a == '') {
    return b;
} else if (b == '') {
    return a;
} else {
    return (BigInt(a) + BigInt(b)).toString();
}
}
console.log(sumStrings('712569312664357328695151392', '8100824045303269669937'));

题目测试;

显然,对于BIgInt()这个方法,不能通过测试。

BigInt 是一种内置对象,可以表示大于 253 的整数。而在Javascript中,Number 基本类型可以精确表示的最大整数是 253。BigInt 可以表示任意大的整数。

BigInt 现在处在 ECMAScript 标准化过程中的 第三阶段 。

当它进入第四阶段草案,也就是最终标准时, BigInt 将成为 Javacript 中的第二种内置数值类型。(所以在测试代码时候,出现了报错。)

BigInt 可能会成为自 ES2015 引入 Symbol 之后,增加的第一个新的内置类型。

语法

BigInt(value);

参数

value

创建对象的数值。可以是字符串或者整数。

注意, BigInt() 不是构造函数,因此不能使用 new 操作符。

描述

可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数BigInt()

第三次尝试

对于大的数字的计算,个人思路:

  • 对于空值,返回一方不为空的
  • 两个都不为空,将字符串中的数字颠倒,设置一个进位标志,以便于进位的操作。
  • 最后判断进位标志的状态,决定是否最后加一位
  • 最后将所得到的数字字符串进行颠倒返回

上代码:

function sumStrings(num1, num2) {
        while (num1.length > 1 && num1[0] === '0')
            num1 = num1.slice(1);

        while (num2.length > 1 && num2[0] === '0')
            num2 = num2.slice(1);

        //将字符串颠倒,便于计算
        num1 = num1.split('').reverse().join('');
        // console.log(num1);
        num2 = num2.split('').reverse().join('');
        // console.log(num2);

        var add = 0,
            ans = '';
            //选择最长的字符串进行循环,计算结果
        for (var i = 0, len = num1.length > num2.length ? num1.length : num2.length; i < len; i++) {
            //在相对应的数字进行计算
            var a = i < num1.length ? Number(num1[i]) : 0,
                b = i < num2.length ? Number(num2[i]) : 0;

            var c = a + b + add;
            ans += c % 10;
            //用 add 进行数学中的 10进1操作
            add = c >= 10 ? 1 : 0;
        }

        if (add) ans += add;    //计算完成之后,如果add 为1,表示还有一位还没有进位,使用字符串的连接进行操作
        //最后的字符串颠倒重组并返回
        return ans.split('').reverse().join('');
    }
console.log(sumStrings('', '5'));

去除数字之前的0

测试代码:

console.log(sumStrings('000001', '5'));

代码的解释都写在注释里面了。不懂的地方调试一下就能懂了。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值