Работа с процентами
В завершении второго модуля курса был большой практикум, где в одном из заданий требовалось понимание работы с процентами при математических операциях. И поступило несколько вопросов про то, как это лучше реализовать. Я посмотрел на канале и понял, что также не поднимал этот вопрос тут. Поэтому по возвращению из поездки на выходных, решил написать этот пост с небольшим разбором.
Как мы знаем, в Solidity вообще большие проблемы с математикой, в частности, с делением. А для того, чтобы посчитать 10% от какого-либо числа нужна именно эта операция.
Из школьных лет мы можем вспомнить, чтобы получить процент от числа нужно:
100 шариков - 100 %
——————- ———-
? шариков - 10 %
100 * 10 / 100 = 10 шариков
вроде как, перемножаем крест-накрест.
В Solidity, в самой популярной реализации, примерно также, с одним уточнением.
Я часто в аудитах видел, что вводится некое понятие BasisPoints и приравнивается к 10 000.
uint256 constant public BASIS_POINTS = 10000;
Также можно встретить названия bps или просто bp.
Вот эти 10000, по своей сути, равны 100,00%. Два нуля после запятой сделаны для работы с более мелкими процентами, типа 1,85%.
И для того, чтобы получить 2,75% от общего количества токенов делают примерно так:
(tokenAmount * 275) / BASIS_POINTS;
При этом для дополнительной точности вычисления значений порой допускают другие операции, типа округление вверх или вниз.
Я встречал еще не очень популярные библиотеки (часто написанные разработчиками для какого-то конкретного протокола), но вариант с bps, наверное, самый популярный.
А вы знаете еще какие-нибудь варианты работы с процентами?
#math #percentage
В завершении второго модуля курса был большой практикум, где в одном из заданий требовалось понимание работы с процентами при математических операциях. И поступило несколько вопросов про то, как это лучше реализовать. Я посмотрел на канале и понял, что также не поднимал этот вопрос тут. Поэтому по возвращению из поездки на выходных, решил написать этот пост с небольшим разбором.
Как мы знаем, в Solidity вообще большие проблемы с математикой, в частности, с делением. А для того, чтобы посчитать 10% от какого-либо числа нужна именно эта операция.
Из школьных лет мы можем вспомнить, чтобы получить процент от числа нужно:
100 шариков - 100 %
——————- ———-
? шариков - 10 %
100 * 10 / 100 = 10 шариков
вроде как, перемножаем крест-накрест.
В Solidity, в самой популярной реализации, примерно также, с одним уточнением.
Я часто в аудитах видел, что вводится некое понятие BasisPoints и приравнивается к 10 000.
uint256 constant public BASIS_POINTS = 10000;
Также можно встретить названия bps или просто bp.
Вот эти 10000, по своей сути, равны 100,00%. Два нуля после запятой сделаны для работы с более мелкими процентами, типа 1,85%.
И для того, чтобы получить 2,75% от общего количества токенов делают примерно так:
(tokenAmount * 275) / BASIS_POINTS;
При этом для дополнительной точности вычисления значений порой допускают другие операции, типа округление вверх или вниз.
Я встречал еще не очень популярные библиотеки (часто написанные разработчиками для какого-то конкретного протокола), но вариант с bps, наверное, самый популярный.
А вы знаете еще какие-нибудь варианты работы с процентами?
#math #percentage
👍12