Nodejs / Javascript получают числа между начальным номером и конечным номером, когда каждый номер имеет более 15 цифр - PullRequest
0 голосов
/ 24 июня 2019

Я пытался получить числа (iccid - что-то, что нужно вычислить) между start_number и end_number, используя следующую логику:

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 бита.

Я пытался использовать библиотеку javascript big-number , но не смог заставить ее работать с циклом for.

Как лучше всего решить эту проблему?

Я также пытался увеличить nodejs memory limit после прочтения этой темы, но не смог решить проблему: Поток StackOverflow

Примечание : самое большое безопасное целое число в JavaScript - 9007199254740991 (253-1), тогда как самое маленькое безопасное целое число - -9007199254740991.

ICCID (идентификатор платы с интегральной схемой) - SIM-карта содержит уникальный серийный номер (ICCID). ICCID хранятся на SIM-картах, а также печатаются на SIM-карте в процессе персонализации. Может содержать от 18 до 20 цифр

Ответы [ 2 ]

1 голос
/ 24 июня 2019

По вашему вопросу вы хотите получить все числа между 2 большими числами.Вы можете использовать библиотеку bignumber.js https://www.npmjs.com/package/bignumber.js .it, которая обрабатывает все операции, связанные с большими числами.

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
}
0 голосов
/ 24 июня 2019

Да, вы можете добавить любое количество цифр.Вы можете установить lodash в свой проект или включить внешний javascript.

import _ from "lodash";

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

Вы можете обратиться к документации отсюда добавить два числа, используя lodash

...