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

Posted

技术标签:

【中文标题】当每个数字超过 15 位时,Nodejs / Javascript 获取开始数字和结束数字之间的数字【英文标题】:Nodejs / Javascript get the numbers between a start number and end number when each number has more than 15 digits 【发布时间】:2019-06-24 10:48:09 【问题描述】:

我试图使用以下逻辑获取 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双精度浮点数,这意味着我只有大约16位的精度;剩余的 64 位为指数保留。如果您需要所有 64 位,我必须使用一些技巧来获得更高的精度。

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

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

我也尝试在阅读此线程后增加nodejs memory limit但无法解决问题:*** thread

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

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

【问题讨论】:

“我尝试使用大数字 javascript 库,但无法使其与 for 循环一起使用” - 如果你想获得,你也必须添加这种方法帮忙。 我不认为这是关于巨大的数字,而是关于巨大的数组。该错误看起来像是您正在尝试创建一个包含大量元素的数组。 (另外,如果相关:xyproblem.info) @ChrisG 我也有同样的想法,但正如你所看到的,在数字上它只是 29 的差异,所以不确定它是否与数组有关 我在浏览器中进行了快速检查,显然您的循环中的 i 没有正确递增。这会将循环变成一个无限循环,从而尝试创建一个无限大的数组。所以这确实是一个大数问题,这让我回到了 XY 问题问题。你想在这里做什么?为什么需要一个包含大量数字的数组? @ChrisG 感谢您的回答,我试图在作为输入的 start_iccid 和 end_iccid 之间获取所有 iccid(与 esim 相关的东西) 【参考方案1】:

根据您的问题,您希望获得两个大数字之间的所有数字。您可以使用 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

【讨论】:

感谢您的回答,但我收到以下错误 x.isLessThanOrEqualTo is not a function(我在 nodejs 应用程序中运行此代码) 您是否使用let x = new BigNumber("your number");将 x 转换为 bignumer 这个给定的代码对我来说运行得很好。可能是您安装了其他一些 bignumber js 库。尝试使用npm install bignumber.js重新安装它 @是的,你是对的,我把 npm 包弄错了,我安装了big-number。感谢您的帮助【参考方案2】:

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

import _ from "lodash";

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

您可以参考这里的文档add two numbers using lodash

【讨论】:

以上是关于当每个数字超过 15 位时,Nodejs / Javascript 获取开始数字和结束数字之间的数字的主要内容,如果未能解决你的问题,请参考以下文章

身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X

仅当至少一个数字为 2 位时才能使用大数字(字符串)函数进行乘法运算

Java 日志中找不到自定义线程的原因,线程名显示不全

Largest Beautiful Number CodeForces - 946E (贪心)

将万亿数字转换为二进制

c# 导入导出excel表格式