这是我的可靠代码,我试图比较传递的变量和不同的变量。由于浮点数据类型不受solidity支持,而且函数输入默认为18个零尾,所以我使用timeAmount来乘10^18。
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个零的变量。
await nft.connect(deployer).setUriToUpdate(15 * 10 ** 18)
错误是:
有人能告诉我如何把大号码传递给这个函数吗?
提前谢谢!
发布于 2022-12-30 14:04:24
之所以失败是因为15 * 10 ** 18
的结果超出了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/
要解决这个问题,您有多个选项:
BigInt
类型,并在数字末尾附加一个n
:...setUriToUpdate(15n * 10n ** 18n)...
将结果转换为字符串:
contract.setUriToUpdate("15000000000000000000").
使用ethers.BigNumber.from
在乘法之前转换每个因素:
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)
});
诸若此类。
发布于 2023-01-05 07:18:04
此错误是由于溢出造成的,您可以使用BigInt数据类型。要使用它,只需包括
/* global BigInt */
在您的代码文件的顶部。然后使用BigInt来计算,而不是使用数字数据类型。
const bigNumber = BigInt(/*smthing*/).toString(10)
希望能帮上忙!
https://ethereum.stackexchange.com/questions/142064
复制相似问题