首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用etherjs输入大数

如何用etherjs输入大数
EN

Ethereum用户
提问于 2022-12-30 11:39:23
回答 2查看 457关注 0票数 1

这是我的可靠代码,我试图比较传递的变量和不同的变量。由于浮点数据类型不受solidity支持,而且函数输入默认为18个零尾,所以我使用timeAmount来乘10^18。

代码语言:javascript
运行
复制
function setUriToUpdate(uint256 temperature) public {
    uint256 timesAmount = 10 ** 18;
    if (temperature < 10 * timesAmount) {
       uriToUpdate = METADATA_BELOW;
    } else if (temperature > 10 * timesAmount && temperature < 20 * timesAmount) {
       uriToUpdate = METADATA_AVERAGE;
    } else if (temperature >= 20 * timesAmount && temperature < 50 * timesAmount) {
       uriToUpdate = METADATA_ABOVE;
    }
}

当我用js代码编写单元测试时,我不知道如何传递一个带有18个零的变量。

代码语言:javascript
运行
复制
await nft.connect(deployer).setUriToUpdate(15 * 10 ** 18)

错误是:

错误:溢出https://links.ethers.org/v5-errors-NUMERIC_故障溢出:请参阅

有人能告诉我如何把大号码传递给这个函数吗?

提前谢谢!

EN

回答 2

Ethereum用户

回答已采纳

发布于 2022-12-30 14:04:24

之所以失败是因为15 * 10 ** 18的结果超出了Javascript中被认为是安全的范围。

如果在Javascript中打印结果:

代码语言:javascript
运行
复制
console.log("Number.MAX_SAFE_INTEGER: ", Number.MAX_SAFE_INTEGER);

你会得到:

9007199254740991

这是一个53位的数字。它有16位数。

如果打印15 * 10 ** 18的结果:

15000000000000000000

Number.MAX_SAFE_INTEGER大20位数。

查看这里的以太the文档:https://docs.ethers.org/v5/api/utils/bignumber/

要解决这个问题,您有多个选项:

  1. 将每个数字转换为内置Javascript BigInt类型,并在数字末尾附加一个n
代码语言:javascript
运行
复制
...setUriToUpdate(15n * 10n ** 18n)...

将结果转换为字符串:

代码语言:javascript
运行
复制
contract.setUriToUpdate("15000000000000000000").

使用ethers.BigNumber.from在乘法之前转换每个因素:

代码语言:javascript
运行
复制
const fifteen = ethers.BigNumber.from(15);
const ten = ethers.BigNumber.from(10);
const eighteen = ethers.BigNumber.from(18);

contract.setUriToUpdate(fifteen.mul(ten).mul(eighteen)).then(response => {
    console.log("response2: ", response) 
});

诸若此类。

票数 0
EN

Ethereum用户

发布于 2023-01-05 07:18:04

此错误是由于溢出造成的,您可以使用BigInt数据类型。要使用它,只需包括

代码语言:javascript
运行
复制
/* global BigInt */

在您的代码文件的顶部。然后使用BigInt来计算,而不是使用数字数据类型。

代码语言:javascript
运行
复制
const bigNumber = BigInt(/*smthing*/).toString(10)

希望能帮上忙!

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

https://ethereum.stackexchange.com/questions/142064

复制
相关文章

相似问题

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