solidity语言中没有浮点类型。所以我们在处理数值类型时应该注意,solidity中只有整数除法,而整数除法会损失精度!小于除数的精度都会被舍弃!所以处理以太币的时候应该使用其最小单位wei。同样在ERC20智能合约中指定了decimals的情况下,同样使用其最小单位来处理具体的数值。

示例:

constract FunWithNumbers {
        uint constant public tokensPerEth = 10;
        uint constant public weiPerEth = 1e18;
        mapping(address => uint) public balance;
        
        function buyTokens() public payable {
            uint tokens = msg.sulve/tokensPerEth*weiPerEth;
            balances[msg.sender] += tokens;
        }
        
       function sellTokens(uint tokens) public {
            require(balances[msg.sender] >= tokens);
            uint eth = tokens/tokensPerEth;
            balances[msg.sender] -= tokens;
            msg.sender.transfer(eth*weiPerEth);
       } 
}

第6行使用msg.sulve先除以1e18,这会导致小于1ether的所有精度都被舍弃。后面sellTokens的处理也是错误的。在智能合约中一定要使用最小单位来处理数据。

应该使用wei来记录余额。换算为ether的处理应该在应用层。

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐