как отправить эфир десятичными знаками?

скажем, у меня есть функция, которая отдает дивиденды в зависимости от того, сколько акций принадлежит этому клиенту:

// Give away dividend based on how many balances of each customer has
function giveAwayDividend(uint _value) onlyOwner {
for(uint i=0;i<size();i++){
    //balances[customerAddress[i]] = balances[customerAddress[i]].add(balances[customerAddress[i]]*_value/totalSupply);
    //Transfer(msg.sender, customerAddress[i], (balances[customerAddress[i]] * _value / totalSupply) );
    customerAddress[i].send((balances[customerAddress[i]] * _value) / totalSupply);
   }
}

проблема в том, как мне отправить эфир десятичными знаками? Если у клиента А есть 100 монет, общий запас 50000 монет, общая сумма дивидендов 10 эфиров, он должен получить 100/50000 * 10 = 0,02 эфира, но здесь я думаю (балансы[customerAddress[i]] * _value) / totalSupply даст я 0?

Как мне это исправить?

Ответы (1)

В чем именно заключается ваша проблема с реализацией 100/50000 * 10 = 0,02ETH? Балансы обрабатываются в Wei bei по умолчанию, 1 Wei * 10^18 = 1ETH, поэтому 0,02ETH == 200000000000000000 Wei, используйте этот конвертер единиц .

Я вижу в этом более фундаментальную проблему: если customerAddress[i]получается долго, вызов giveAwayDividendкаждый раз будет терпеть неудачу, запуская out of gas.

К сожалению, я только что посмотрел на Вэй, и вы правы, с моим вопросом проблем нет. Что касается второго вопроса, как долго это приведет к сбою моей функции? Поскольку я вызываю ее только раз в квартал, можно платить немного денег за вызов этой функции четыре раза в год, если только каждый раз она будет успешно выполняться.
Рад, что смог помочь. Здесь время не имеет значения, важна сумма платежей. При определенном количестве адресов, которые вы платите, требования к газу будут слишком высокими.
Должно ли это "100/50000 * 10" быть "(10 * 100)/50000" из-за отсутствия плавающей запятой? Я думаю, в данном случае, поскольку результат 100/50000 является целым числом, это не имеет значения, а просто любопытно.
Всегда избегайте ситуаций с плавающей запятой и записывайте числа как умножение с коэффициентом, имеющим экспоненту, чтобы избежать ошибок. например, при расчете ETH с помощью wei напишите 1 * 10^18 вместо 10000000000000000000.