Ввод функции твердости с десятичным числом

Я не уверен, как принять десятичный ввод в функцию, а затем рассчитать с десятичным токеном.

Сказал, что десятичный токен равен 18. Если функция хочет принять значение 123,4567, как получить результат вывода в виде 123456700000000000

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

function chkAmt(uint _amt) view public returns(uint256){
     uint256 finalAmt = amt;
     return finalAmt;
}

Этот вывод 123 без остатка числа. Я думаю, что uint _amtдесятичное число уже игнорируется, поскольку оно является целым числом без знака.

Я пробовал следующее, также не удалось. Если я ввожу 123.34567

uint8 public token_decimal = 18;
function chkAmt(uint _amt) view public returns(uint256){
    uint256 decfactor = 10**uint256(token_decimal);
    uint256 rtnamt = _amt.mul(decfactor);
    return rtnamt;
}

Вывод 123000000000000000000, что неверно.

Как правильно ввести 123.4567 и получить результат 1234567000000000000000???

Ответы (1)

На самом деле все внутренние и функциональные интерфейсы имеют дело с целыми числами. Это token_decimalзначение является частью стандарта ERC20. Это сигнал для пользовательских интерфейсов о том, что значения должны быть разделены на 10**18, чтобы получить удобочитаемое представление. Например, доллар будет равен 100 / 2 десятичных дроби.

Вы добьетесь наилучших результатов, если донесете эту заботу до клиентов. Другими словами, заставляйте клиентов говорить на языке контракта и не применяйте какие-либо формы преобразования внутри контракта. На мой взгляд, решение этой проблемы вносит нежелательную и ненужную сложность в большинство контрактов, поэтому этого следует избегать.

Надеюсь, поможет.