我在这里看到了这个职位,它展示了如何将BigNumber转换为打字记录中的正常数字。Ethers.jsis通常用于ethereum的开发,并提供BigNumber类型,并协助将值从onchain转换为脱离链,例如在javascript应用程序中。
我的问题是:我有一个名为arr的数组,它由函数返回的BigNumbers组成。如果我是console.log(arr),它的格式如下:
{
size: BigNumber { value: '2' },
pricePerDay: [ BigNumber { value: '103897429' }, BigNumber { value: '103827546' } ],
unixDate: [ BigNumber { value: '1670268628' }, BigNumber { value: '1670268634' } ]
}通常,要将BigNumber转换为etherjs使用的数字,您将使用提供的toNumber()函数。因此,我可以很容易地在示例中转换size:
arr.size = arr.size.toNumber();但是这个arr响应中的其他数字是pricePerDay和unixDate,它们包含在数组中。是否有一种简单的方法将整个数组转换为一个常规数字?
// this fails with TypeError: arr.priceperDay.toNumber is not a function
arr.pricePerDay = arr.pricePerDay.toNumber()我知道我可以使用map,但是由于溢出错误失败了。下面是我试图应用toNumber()函数来转换所有元素的尝试:
// 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);上述尝试导致以下溢出错误:
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)发布于 2022-12-04 20:34:12
您提供的错误消息解释了这个问题:
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中的最大整数大小,如以下代码所示:
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类型。
https://stackoverflow.com/questions/74680436
复制相似问题