【问题标题】:Converting array of digits to a number将数字数组转换为数字
【发布时间】:2017-04-05 12:16:19
【问题描述】:

给定以下字符串数组:

["9", "3", "3", "3", "8", "5", "2", "7", "0", "2", "2", "2", "7", "9", "8", "7"]

我已经编写了这个 reduce 代码,试图将数组转换为数字(不使用任何内置解析器)。

d.reduce((res,n,idx)=>{
   res *= 10;
   res += n.charCodeAt(0) - 48;
   console.log(res);
   return res;
},0);

这是日志:

9
93
933
9333
93338
933385
9333852
93338527
933385270
9333852702
93338527022
933385270222
9333852702227
93338527022279
933385270222798
9333852702227988

933385270222798(8)

我注意到9333852702227980 + 7 = 9333852702227988

当数字很大时,代码就会消失,我猜我超出了安全的整数范围。我该如何解决这个问题?

【问题讨论】:

  • 如您所料,您已经超出了Number.MAX_SAFE_INTEGER 的范围,即9007199254740991(2**53)-1,因此您正在失去精度。
  • var num = nums.reduce((p,c) => 10*p + +c); 但正如@squint 所述,如果总和超过最大安全整数限制,则结果不再安全。
  • 那么,是否可以在 JS 中解析更大的 MAX_SAFE_INTEGER 数字?
  • 我不确定您想要实现什么。你一定需要一个数字而不是一个字符串吗?您认为什么是“内置解析器”?
  • @RoniGadot - 如果你想保持在 JavaScript 原生类型中,那么不,你总是会失去精度。但是有许多任意精度的整数包可用。你要么必须使用一个,要么设计一个。

标签: javascript arrays reduce parseint


【解决方案1】:

function convertArrayToNumber(arr) {
    let result = ""
    for (el of arr) {
        result += el
    }
    return result
}

let yourArray = ["9", "3", "3", "3", "8", "5", "2", "7", "0", "2", "2", "2", "7", "9", "8", "7"]
Number(convertArrayToNumber(yourArray))

【讨论】:

    【解决方案2】:

    先转换成字符串,然后用replaceAll函数替换结果字符串上的逗号:

    const arr = ["9", "3", "3", "3", "8", "5", "2", "7", "0", "2", "2", "2", "7", "9", "8", "7"]
    const no = (arr.toString()).replaceAll(',','');
    console.log("result: ", no)

    【讨论】:

      【解决方案3】:

      查看任意精度整数算术包,例如Big NumbersBigCrunch。他们应该给你一些关于如何推出自己的想法。

      【讨论】:

        【解决方案4】:

        var arr = ["9", "3", "3", "3", "8", "5", "2", "7", "0", "2", "2", "2", "7", "9", "8", "7"];
        var num = 0;
        
        for (a = arr.length - 1; a >= 0; a--) {
          num += arr[a] * Math.pow(10, (arr.length - 1) - a);
        }
        
        Number.prototype.add = function(x) {
          var out = 0;
          for (a = arr.length - 1; a >= 0; a--) {
            out += (arr[a] * 1 + (x[(arr.length - 1) - a] || 0) * 1) * Math.pow(10, (arr.length - 1) - a);
          }
          return out;
        }
        
        console.log(num);
        console.log(num.add('7'));

        【讨论】:

        • Number 也是一个内置解析器。您的第一个结果日志显示同样的精度损失。
        • 是的,我一直在玩弄你的例子,因为它似乎给出了预期的结果。我只是不知道它实际上可以完成,因为整数仅用 53 位表示,所以我不知道如何不能丢失精度。但如果有什么技巧,那就真的很有趣了。
        • 我的想法是在每个数字的级别进行加法,以避免超出安全整数范围。
        • 是的,但最终您需要将它们存储在一起,结果数字将超过 53 位范围。但是,如果有一些技巧可以让 JS 引擎让您“借用”该范围之外的一些位,那将是非常巧妙的。我怀疑这是可能的,但谁知道呢。
        猜你喜欢
        • 2017-11-10
        • 1970-01-01
        • 2022-08-09
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多