Расчеты с использованием процентов: десятичные или читаемые? - PullRequest
0 голосов
/ 13 февраля 2019

Простой вопрос (и извинения, если это слишком основано на мнении): Как мне хранить проценты?

При написании программы, которая включает в себя большое количество аналитических расчетов, или финансовых расчетов с процентами (ставки возврата,APR, размер прибыли и т. Д.), Какой из трех приведенных ниже вариантов является наилучшей практикой с точки зрения производительности, читаемости, надлежащей практики кодирования и т. Д.20% = 0.20 и напишите фильтр для преобразования этого в пользовательский интерфейс.(В django это будет шаблонная метка, которую нужно будет применять каждый раз, когда отображается процент).

Сохранять проценты как целые числа и делить на 100 всякий раз, когда необходимо выполнить вычисления вбэкэнд, т. е. 20,13% хранится как 20.13 и используется как percent/100 * myNumber.

Создать (или использовать библиотеку) тип данных для Percent, который может выполнять и то и другое, например:наличие атрибута «Percent.value» с атрибутом оформленного свойства для «Percent.display», который умножается на 100 и округляется.Я полагаю, что в этом классе для __str__ задано отображаемое значение, тогда как во всех других операциях используется необработанное значение.

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

Что наиболее широко используется в промышленности и почему?

1 Ответ

0 голосов
/ 13 февраля 2019

Я предлагаю что-то вроде вашего варианта 1.

Но вместо float вы должны использовать библиотеку Pythons decimal и, например, Djangos DecimalField чтобы сохранить его в базе данных.Объект decimal.Decimal допускает фиксированное округление, которое избавит вас от многих головных болей.

Я предлагаю хранить проценты в качестве значения, которое вам понадобится для умножения (пример: store 21.56% как Decimal('0.2156')).На мой взгляд, лучше изменять отображение при необходимости, чем делать преобразования в вычислениях.

И да, тег шаблона в Django звучит как хороший способ показать эти значения в процентах.

...