Nodejs / Javascript получают числа между начальным номером и конечным номером, когда каждый номер имеет более 15 цифр
Я пытался получить числа (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, но не смог заставить ее работать for
петля
Что было бы наилучшим возможным решением этой проблемы?
Я также пытался увеличить nodejs memory limit
после прочтения этой темы, но не смог решить проблему: поток Stackru
Примечание. Самое большое безопасное целое число в JavaScript - это 9007199254740991 (253-1), а самое маленькое безопасное целое - -9007199254740991.
ICCID (идентификатор платы с интегральной схемой) - SIM-карта содержит уникальный серийный номер (ICCID). ICCID хранятся на SIM-картах, а также печатаются на SIM-карте в процессе персонализации. Может иметь от 18 до 20 цифр
2 ответа
По вашему вопросу вы хотите получить все числа между 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
}
Да, вы можете добавить любое количество цифр. Вы можете установить lodash в свой проект или включить внешний javascript.
import _ from "lodash";
let result = _.add(100000000000000000, 100000000000000029);
console.log(result);
Вы можете обратиться к документации отсюда добавить два числа, используя lodash