Сколько токенов передается на самом деле, когда мы используем десятичные дроби

У меня есть код ниже, и когда я перевожу 1 695 000 000 на определенный адрес, на самом деле переводится 0,000000001695. Почему это так? Означает ли это, что для передачи 1,695 миллиарда токенов мне нужно поставить 18 начальных нулей. Вот код:

function transfer(address _to, uint256 _amount) public returns (bool success) {
    require(_to != address(0));
    require(balances[msg.sender] >= _amount && _amount > 0
        && balances[_to].add(_amount) > balances[_to]);

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_amount);
    balances[_to] = balances[_to].add(_amount);
    Transfer(msg.sender, _to, _amount);
    return true;
  }


contract SomeToken is MintableToken, BurnableToken {
     string public name ;
     string public symbol ;
     uint8 public decimals = 18 ;

     /**
     *@dev users sending ether to this contract will be reverted. Any ether sent to the contract will be sent back to the caller
     */
     function ()public payable {
         revert();
     }

     /**
     * @dev Constructor function to initialize the initial supply of token to the creator of the contract
     * @param initialSupply The initial supply of tokens which will be fixed through out
     * @param tokenName The name of the token
     * @param tokenSymbol The symbol of the token
     */
     function SomeToken(
            uint256 initialSupply,
            string tokenName,
            string tokenSymbol
         ) public {
         totalSupply = initialSupply.mul( 10 ** uint256(decimals)); //Update total supply with the decimal amount
         name = tokenName;
         symbol = tokenSymbol;
         balances[msg.sender] = totalSupply;

         //Emitting transfer event since assigning all tokens to the creator also corresponds to the transfer of tokens to the creator
         Transfer(address(0), msg.sender, totalSupply);
     }
}
Но это выдает ошибку. Предположим, что мой общий запас составляет 5 000 000 000, и когда я пытаюсь перевести до 2 миллиардов с 18 ведущими 0, он показывает ошибку в ремиксе «SomeToken.transfer errored: Ошибка кодирования аргументов: Ошибка: Ошибка утверждения».
вы должны добавить эту строкуtokenCount ** uint256(decimals)
Вместо добавления начальных нулей обновите свой контракт строкой выше для tokenCount.
Не могли бы вы рассказать немного больше, где эта строка будет добавлена.
Обновите код с функцией передачи в вашем контракте
Подумайте о том, чтобы проголосовать за ответы, если вы сочтете их полезными.

Ответы (2)

Ваши токены разделены на X знаков после запятой (18 в вашем случае). По умолчанию (и по соглашению) переводы основаны на минимально возможной сумме, чтобы в переводах не было десятичных чисел. Таким образом, передача количества, равного 1, означает передачу 0,000000000000000001 (17 нулей) токенов.

Я предполагаю, что это в основном для того, чтобы нам не нужно было иметь дело с дробными числами, которые требуют больше памяти и более трудны для понимания программами. Эфир работает так же.

Когда вы вызываете функцию для перевода монет (transfer), вам нужно умножить параметр «сумма» на 10**uint (десятичные числа). Что будет делать.

Это сложно, так как это необходимо, только если вы вызываете передаточную функцию напрямую. Если вы совершаете транзакцию из своего кошелька на любой другой адрес, вам не нужно этого делать, потому что кошелек будет «знать», что вы используете определенное количество десятичных знаков в своем контракте. Одна только функция «передача» этого не знает.

Примечание: передаточная функция должна находиться внутри тела контракта.