当每个数字超过 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 位时才能使用大数字(字符串)函数进行乘法运算