javascript - Nodejs/Javascript 当每个数字超过 15 位时获取起始数字和结束数字之间的数字

标签 javascript arrays node.js heap-memory iccid

我试图使用以下逻辑获取 start_number 和 end_number 之间的数字(iccid - 与 esim 相关的东西):

let { start_iccid, end_iccid } = req.value.body;
let list = [];
let lowEnd = parseInt(start_iccid); // sample value : 100000000000000000
let highEnd = parseInt(end_iccid); // sample value : 100000000000000029
for (let i = lowEnd; i <= highEnd; i++) {
   list.push(i);
}

正如预期的那样,我收到以下错误:

FATAL ERROR: invalid array length Allocation failed - JavaScript heap out of memory
 1: node::Abort() [/home/cavli/.nvm/versions/node/v8.11.4/bin/node]
 2: 0x8c21ec [/home/cavli/.nvm/versions/node/v8.11.4/bin/node]
 3: v8::Utils::ReportOOMFailure(char const*, bool) [/home/cavli/.nvm/versions/node/v8.11.4/bin/node]
 4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/home/cavli/.nvm/versions/node/v8.11.4/bin/node]
 5: v8::internal::Heap::AllocateUninitializedFixedDoubleArray(int, v8::internal::PretenureFlag) [/home/cavli/.nvm/versions/node/v8.11.4/bin/node]
 6: v8::internal::Factory::NewFixedDoubleArray(int, v8::internal::PretenureFlag) [/home/cavli/.nvm/versions/node/v8.11.4/bin/node]
 7: 0xd554b5 [/home/cavli/.nvm/versions/node/v8.11.4/bin/node]
 8: v8::internal::Runtime_GrowArrayElements(int, v8::internal::Object**, v8::internal::Isolate*) [/home/cavli/.nvm/versions/node/v8.11.4/bin/node]
 9: 0x217d6df042fd

我知道在Javascript中,所有数字都是IEEE double float ,这意味着我只有大约16位的精度;其余 64 位保留用于指数。如果您需要所有 64 位,我必须使用一些技巧来获得更高的精度。

我尝试使用 big-number javascript 库,但无法使其与 for 循环一起使用。

解决这个问题的最佳方案是什么?

在阅读此线程后,我还尝试增加 Nodejs 内存限制,但无法解决问题:StackOverflow thread

注意:JavaScript 中最大的安全整数是 9007199254740991 (253-1),而最小的安全整数是 -9007199254740991 。

ICCID(集成电路卡标识符)- SIM 卡包含其唯一的序列号 (ICCID)。 ICCID 存储在 SIM 卡中,并在个性化过程中打印在 SIM 卡上。可以有 18 到 20 位数字

最佳答案

根据您的问题,您希望获得 2 个大数字之间的所有数字。您可以使用 bignumber.js 库 https://www.npmjs.com/package/bignumber.js .它处理与大数相关的所有操作。

const BigNumber = require('bignumber.js');


let arr = []; 
let x = new BigNumber("100000000000000000");
let y = "100000000000000029";
while (x.isLessThanOrEqualTo(y)) {
    arr.push(x.toString());
    x = x.plus(1);
}


for (let elem of arr) {
    console.log(elem); //it contains all your elements
}

关于javascript - Nodejs/Javascript 当每个数字超过 15 位时获取起始数字和结束数字之间的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56734974/

相关文章:

python - 根据端点递归划分列表

javascript - 在 node.js/javascript 中无法收到错误

angularjs - Node.js $http PUT 请求不会向服务器返回任何内容

javascript - 模块相互需要导致错误 "Maximum call stack size exceeded"

javascript - 创建一个 "repin"类型的操作,但为每个用户提供唯一的描述

javascript - NodeJs : modules. 导出:找不到我自己的自定义模块之一

javascript - 使用包含的 lambda (node.js) FilterExpression 的 DynamoDB 查询

javascript - 是否有任何 javascript 监听器用于将元素添加到 DOM 中的另一个元素中?

c - C 中的函数,实现两个 int 数组在另一个数组中的数学并集

arrays - mustache - 如何检测数组不为空?