固体小数值

Solidity decimal values

我需要设置用户可以支付的最低价值,这个价值必须是例如 0.5 BNB。 但是我不知道我该怎么做。

    uint comissionFee = 5; // 5 will represent 0,5
    uint256 minimunPay = comissionFee*100/1000;

但是return0

  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 中 msg.value 不表示为以太币,而是表示为 Wei,一种较小的以太币面额,您可以将其视为带 18 位小数的以太币。例子: 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 以更好地演示其工作原理。

首先,solidity lang中没有双数。

所有计算均使用整数。为了解决这个问题,Ethereum/Binance Chain 上的所有代币都将一些大的十进制数作为 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");
  }