【问题标题】:Solidity decimal valuesSolidity 十进制值
【发布时间】:2022-01-20 14:22:22
【问题描述】:
我需要设置一个用户可以支付的最小值,这个值必须是例如 0.5 BNB。
但我不知道我该怎么做。
uint comissionFee = 5; // 5 will represent 0,5
uint256 minimunPay = comissionFee*100/1000;
但返回 0
pragma solidity ^0.8.4;
function payFees() public payable {
require(msg.value >= 0.5); // <-- not compatible with uint256
(bool success,) = owner.call{value: msg.value}("");
require(success, "Failed to send money");
}
【问题讨论】:
标签:
solidity
smartcontracts
【解决方案1】:
首先,solidity 语言中没有双数。
所有的计算都是用整数完成的。为了解决这个问题,以太坊/币安链上的所有代币都将某个大的十进制数作为 double 和 ceil 部分的阈值。
在 ERC20 代币中,这个数字是根据合约的十进制字段计算得出的:10^decimal。
对于原生代币 ETH/BNB,有一个固定的小数点,等于 18。
您的代码可以这样修复:
pragma solidity ^0.8.4;
function payFees() public payable {
require(msg.value >= 0.5 ether);
(bool success,) = owner.call{value: msg.value}("");
require(success, "Failed to send money");
}
或
pragma solidity ^0.8.4;
function payFees() public payable {
require(msg.value >= 5 * 10**17);
(bool success,) = owner.call{value: msg.value}("");
require(success, "Failed to send money");
}
【解决方案2】:
在 solidity 中,msg.value 不表示为 Ether,但作为 Wei 是较小面额的 ether,您可以将其视为 18 位小数的 ether。例子:
1 个以太币是1000000000000000000 Wei。请注意,据我所知,这适用于大多数链 BSC 也是基于 18 位十进制系统,因此 0.5BNB 将是 500000000000000000 Wei 这样您就可以像这样检查十进制值:
pragma solidity ^0.8.4;
function payFees() public payable {
require(msg.value >= 500000000000000000);
(bool success,) = owner.call{value: msg.value}("");
require(success, "Failed to send money");
}
或者:
pragma solidity ^0.8.4;
function payFees() public payable {
require(msg.value >= 0.5 ether);
(bool success,) = owner.call{value: msg.value}("");
require(success, "Failed to send money");
}
您还可以查看 this 以更好地演示其工作原理。