首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型记录将大数字数组转换为正常数字TypeError: array.toNumber不是一个函数

类型记录将大数字数组转换为正常数字TypeError: array.toNumber不是一个函数
EN

Stack Overflow用户
提问于 2022-12-04 20:02:52
回答 1查看 20关注 0票数 0

我在这里看到了这个职位,它展示了如何将BigNumber转换为打字记录中的正常数字。Ethers.jsis通常用于ethereum的开发,并提供BigNumber类型,并协助将值从onchain转换为脱离链,例如在javascript应用程序中。

我的问题是:我有一个名为arr的数组,它由函数返回的BigNumbers组成。如果我是console.log(arr),它的格式如下:

代码语言:javascript
运行
复制
{
   size: BigNumber { value: '2' },
   pricePerDay: [ BigNumber { value: '103897429' }, BigNumber { value: '103827546' } ],
   unixDate: [ BigNumber { value: '1670268628' }, BigNumber { value: '1670268634' } ]
}

通常,要将BigNumber转换为etherjs使用的数字,您将使用提供的toNumber()函数。因此,我可以很容易地在示例中转换size

代码语言:javascript
运行
复制
arr.size = arr.size.toNumber();

但是这个arr响应中的其他数字是pricePerDayunixDate,它们包含在数组中。是否有一种简单的方法将整个数组转换为一个常规数字?

代码语言:javascript
运行
复制
// this fails with TypeError: arr.priceperDay.toNumber is not a function
arr.pricePerDay = arr.pricePerDay.toNumber()

我知道我可以使用map,但是由于溢出错误失败了。下面是我试图应用toNumber()函数来转换所有元素的尝试:

代码语言:javascript
运行
复制
// note: i must create a new arr here because the original arr response is read-only
function arrayBigNumberToNumber(arr: BigNumber[] {
    const newArr = arr.map((element: BigNumber, index: number) => {  
        return element.toNumber();
    });
    return newArr;
}

// then I tried to apply the same 
let newArr;
newArr.pricePerDay = arrayBigNumberToNumber(arr.pricePerDay);
newArr.unixDate= arrayBigNumberToNumber(arr.pricePerDay);

上述尝试导致以下溢出错误:

代码语言:javascript
运行
复制
 Error: overflow [ See: https://links.ethers.org/v5-errors-NUMERIC_FAULT-overflow ] (fault="overflow", operation="toNumber", value="1000000000000000000", code=NUMERIC_FAULT, version=bignumber/5.7.0)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-12-04 20:34:12

您提供的错误消息解释了这个问题:

代码语言:javascript
运行
复制
Error: overflow [
  See: https://links.ethers.org/v5-errors-NUMERIC_FAULT-overflow
] (
  fault="overflow",
  operation="toNumber",
  value="1000000000000000000",
  code=NUMERIC_FAULT,
  version=bignumber/5.7.0
)

来自链接文件

溢出 JavaScript使用IEEE 754双精度二进制浮点数字来表示数值。因此,在9,007,199,254,740,991之后的整数集中存在漏洞,这对ether来说是个问题,因为它只有大约0.009以太(在wei中),这意味着超过它的任何值都将开始出现舍入误差。 因此,任何使用超出安全范围的数字的尝试都会引发错误的值。 通常,数字应该保持为字符串、BigNumber实例或使用ES2020 bigints,所有这些都可以安全地使用而不会丢失精度。

在您的示例中,值1000000000000000000超过了number类型在JavaScript中的最大整数大小,如以下代码所示:

代码语言:javascript
运行
复制
console.log('Max number:', Number.MAX_SAFE_INTEGER);
console.log('My number:', '1000000000000000000');

console.log(
  'Is too large?',
  1000000000000000000 > Number.MAX_SAFE_INTEGER,
);

正因为如此,值在JavaScript中不能表示为 类型。

为了处理这样的值,您需要使用现有的BigNumber实例或标准BigInt类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74680436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档