当每个数字的位数都超过15个数字时,Nodejs / Javascript将获得一个介于起始数字和结束数字之间的数字

时间:2019-06-24 10:48:09

标签: javascript arrays node.js heap-memory iccid

我正尝试使用以下逻辑来获取起始编号和结束编号之间的数字(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双精度浮点数,这意味着我只有大约 16位数字; 64位的其余部分保留给指数。如果您需要全部64位,则我必须设法一些技巧以提高精度。

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

解决此问题的最佳方法是什么?

阅读此线程后,我还尝试增加nodejs memory limit,但无法解决问题:StackOverflow thread

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

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

2 个答案:

答案 0 :(得分:1)

根据您的问题,您希望获得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
}

答案 1 :(得分:0)

是的,您可以添加任意数量的数字。您可以在项目中安装lodash或包含外部javascript。

import _ from "lodash";

let result = _.add(100000000000000000, 100000000000000029);
console.log(result);

您可以从这里add two numbers using lodash

查阅文档。