Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Деньги: INT(BIGINT) vs DECIMAL(n,2)
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Известно, что вещественные типы с плавающей запятой FLOAT, REAL, DOUBLE не подходят(или, можно сказать, не очень удобны) для хранения денег. Часто слышу, что деньги лучше хранить в копейках (целый тип) или в типе DECIMAL(n,2). А какой вариант лучше? В каких случаях есть преимущества(недостаток) первого варианта перед вторым? Какие условия задачи надо учитывать при выборе того или другого варианта? Заранее благодарен С уважением, Семен Попов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 12:50 |
|
||
|
Деньги: INT(BIGINT) vs DECIMAL(n,2)
|
|||
|---|---|---|---|
|
#18+
Принципиальной разницы нет. С BIGINT придётся делить/умножать при операциях записи/вывода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 13:26 |
|
||
|
Деньги: INT(BIGINT) vs DECIMAL(n,2)
|
|||
|---|---|---|---|
|
#18+
BuryCommonerПринципиальной разницы нет. С BIGINT придётся делить/умножать при операциях записи/вывода.Да, в приложении с копейками нам придется дополнительно делать обработку ввода/вывода, так же и при разных расчетах с деньгами, а это дополнительные телодвижения, операции. Но многие прогеры, особенно явисты, больше склоняются именно к копейкам. Почему так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 14:18 |
|
||
|
Деньги: INT(BIGINT) vs DECIMAL(n,2)
|
|||
|---|---|---|---|
|
#18+
ЗдравствуйтеSemen PopovИзвестно, что вещественные типы с плавающей запятой FLOAT, REAL, DOUBLE не подходят(или, можно сказать, не очень удобны) для хранения денег. Часто слышу, что деньги лучше хранить в копейках (целый тип) или в типе DECIMAL(n,2). А какой вариант лучше? В каких случаях есть преимущества(недостаток) первого варианта перед вторым? Какие условия задачи надо учитывать при выборе того или другого варианта?Иногда требуется хранить деньги с достаточно большим кол-вом знаков после запятой - для большей точности расчетов. И тогда может сыграть большее кол-во значащих цифр у decimal (31 против 19). В v9.5 есть ещё более удобный тип decfloat. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 14:43 |
|
||
|
Деньги: INT(BIGINT) vs DECIMAL(n,2)
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinИногда требуется хранить деньги с достаточно большим кол-вом знаков после запятой - для большей точности расчетов. И тогда может сыграть большее кол-во значащих цифр у decimal (31 против 19). В v9.5 есть ещё более удобный тип decfloat.Спасибо. Но, не представляю, как организуется логика на уровне базы для хранения дробных копеек, используя только целочисленные типы. Мне кажется, это уже усложнение. Скорее, целочисленный тип для хранения денег используется в простых задачах, где требуется хранить только деньги (реальную сумму), а не всякие там проценты, пени и т.п., которые должны иметь точность более двух знаков после запятой. Если необходимо, рассчёты этих процентов, пени и т.п. можно вынести на уровень приложения, когда это не столь часто используется. В приложении с более сложной логикой (например, в банковских приложениях) было бы логично использовать тип DECIMAL. У меня простая задача. Хранить по людям их денежные затраты. Получать из приложения отчёт о суммарных затратах. Есть ещё НДС, но он нужен только для отчёта, поэтому эти расчёты можно вынести(?) в приложение. Хотя там тоже могу встретить проблемы с вещественными типами данных и операциями над ними. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2008, 15:16 |
|
||
|
Деньги: INT(BIGINT) vs DECIMAL(n,2)
|
|||
|---|---|---|---|
|
#18+
Допустим, вы считаете, что (запрос 1) Код: plaintext 1. 2. Код: plaintext 1. 2. Тогда вы можете, например 1) создать таблицу (назову T) c integer_field 2) создать над этой таблицей view (назову V) с integer_field/100.00 as decimal field 3) делаете для V триггера INSTEAD OF, производящие нужные манипуляции над T Теперь вы можете удобно пользоваться V для небольших количеств данных (например, ручного ввода) и T для суммирования больших количеств. В любом случае, "FLOAT, REAL, DOUBLE" имеют проблемы с представлением и округлением копеек и потому для денег не годятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2008, 07:55 |
|
||
|
Деньги: INT(BIGINT) vs DECIMAL(n,2)
|
|||
|---|---|---|---|
|
#18+
Для произвольного количества знаков после запятой (integer_scale IN (1,10,100,1000...)): Код: plaintext 1. 2. 3. Суммирование; группируем дважды, чтобы уменьшить до минимума количество делений и сложений decimal. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Полагаю, что само по себе суммирование для целых должно быть значительно быстрее, чем decimal (особенно в 64-хбитных системах), но доля времени на чтение с диска может оказаться настолько велика, что овчинка окажется не стоящей выделки. Поэтому для каждого конкретного случая нужно обдумывание и тестирование (конкретных данных на конкретной системе). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2008, 08:35 |
|
||
|
Деньги: INT(BIGINT) vs DECIMAL(n,2)
|
|||
|---|---|---|---|
|
#18+
Victor Metelitsa... Тогда вы можете, например 1) создать таблицу (назову T) c integer_field 2) создать над этой таблицей view (назову V) с integer_field/100.00 as decimal field 3) делаете для V триггера INSTEAD OF, производящие нужные манипуляции над T ...Вот и решение. Я всё не мог додуматься, как организовать на уровне базы функционал обработки ввода/вывода копеек и различных рассчётов с ними. Спасибо. Victor Metelitsa... Полагаю, что само по себе суммирование для целых должно быть значительно быстрее, чем decimal (особенно в 64-хбитных системах), но доля времени на чтение с диска может оказаться настолько велика, что овчинка окажется не стоящей выделки. Поэтому для каждого конкретного случая нужно обдумывание и тестирование (конкретных данных на конкретной системе).Да, одной из причин моего перевеса в сторону целых копеек было то, что операции с целочисленными значениями выполняются быстрее. Но тут, как Вы сказали, надо учитывать и другие факторы. Будем тестировать, работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2008, 09:16 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35612001&tid=1603620]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 389ms |

| 0 / 0 |
