Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Какие типы данных используются для хранения денег  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Господа,
Скажите, а кто какие типы данных использует для хранения денег? Укажите, если можно, DWH, OLTP или что ещё у вас.

Если есть какие-то доводы в пользу того или иного типа, прошу высказаться.
26 июн 14, 12:19    [16222391]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
money
26 июн 14, 12:20    [16222397]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
DECIMAL(9,2)
DECIMAL(19,2)
DECIMAL(28,2)
DECIMAL(38,2)
26 июн 14, 12:36    [16222531]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8813
money, smallmoney.

хранение в целочисленном формате -> точность, производительность, компактность.
26 июн 14, 13:02    [16222699]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
П-Л
Guest
Хранится сумма в целых (в копейках, центах и т.п.), в справочике валют - сколько копеек отделять запятой (как правило 2).
26 июн 14, 13:19    [16222818]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
П-Л
Хранится сумма в целых (в копейках, центах и т.п.), в справочике валют - сколько копеек отделять запятой (как правило 2).


Хорошо. А вот если потом всякие Прибили, Оборачиваемости, Окупаемости надо будет высчитывать? В Кубы, Excel-и, Отчеты выгружать? Тогда какие аргументы? Может само значение достаточно 2 знака, но вот если в промежуточных вычислениях надо больше точность.
26 июн 14, 13:29    [16222903]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Владислав Колосов,

Если операции только сложение/вычитание, то да, целочисленный тип вполне подходит. Если есть умножение/деление - то с округлением будут проблемы.
26 июн 14, 13:31    [16222915]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
it17
Member

Откуда:
Сообщений: 108
Для обычного хранения денег юзаем в банке Money
26 июн 14, 13:47    [16223074]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Mikle83
Member

Откуда: Санкт-Петербург
Сообщений: 653
a_voronin
П-Л
Хранится сумма в целых (в копейках, центах и т.п.), в справочике валют - сколько копеек отделять запятой (как правило 2).


Хорошо. А вот если потом всякие Прибили, Оборачиваемости, Окупаемости надо будет высчитывать? В Кубы, Excel-и, Отчеты выгружать? Тогда какие аргументы? Может само значение достаточно 2 знака, но вот если в промежуточных вычислениях надо больше точность.


Был такой же принцип в учетной системе - мантисcа отдельно / "экспонента" валюты отдельно / "экспонента" отдельно.

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

Внутри механизмов вычисления - да, могут возникать дробные значения, но для них как раз пользуется экспонента вычислений (т.е. до какого знака идет округление) и в итоге все приводится к минимальное единице валюты при хранении.
26 июн 14, 14:04    [16223265]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1809
a_voronin
Господа,
Скажите, а кто какие типы данных использует для хранения денег? Укажите, если можно, DWH, OLTP или что ещё у вас.

Если есть какие-то доводы в пользу того или иного типа, прошу высказаться.


Деньги деньгам рознь. Если речь идет о реальных платежах, которые просто складываются в кучу, то подходят как N(xxx,2), и целые, так как платежа в долю копейки быть не может.

А если нужно ответить на вопрос "Сколько стоит капля водки? Нисколько? Накапайте мне стаканчик...", то есть хранить цену капли водки? Она может быть меньше копейки, и это, строго говоря, уже не деньги, а, скажем так - некий финансовый показатель. Их их может быть много. Тогда точность зависит от конкретной задачи и алгоритма.
26 июн 14, 14:06    [16223288]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
a_voronin
Хорошо. А вот если потом всякие Прибили, Оборачиваемости, Окупаемости надо будет высчитывать?
Подмен вопроса.
Хранить и вычислять это совершенно разные вещи. Хранятся в целых (Money) а вычисляется порой в Decimal.
В каждой части сложной формулы может быть своё приведение типов.

Хотя что об этом говорить, это (как хранить и вычислять и приводить, и почему) изучается на первом курсе любого нормального технического вуза.

Что неудобно в текущем Money - 4 знака, надо ограничивать. сделали бы по умолчанию 2 с ошибкой при трункейте.
А на RULEсы MS забила.
Ими можно было создать свой тип с таким ограничением.
Это уже неоднократно мусолилось на форуме.
29 июн 14, 21:51    [16236101]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Cane Cat Fisher
А если нужно ответить на вопрос "Сколько стоит капля водки? Нисколько? Накапайте мне стаканчик...", то есть хранить цену капли водки? Она может быть меньше копейки, и это, строго говоря, уже не деньги, а, скажем так - некий финансовый показатель. Их их может быть много. Тогда точность зависит от конкретной задачи и алгоритма.
Вообще говоря, в нормальном большом бизнесе такие задачи решаются тоже без потери точности.

Просто хранят цену не как 0.0000021 р за каплю, в как 21 коп за 10000 капель. Т.е. хранят 2 числа - "сколько денег" за "сколько товара"
30 июн 14, 02:39    [16236610]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
alexeyvg
Cane Cat Fisher
А если нужно ответить на вопрос "Сколько стоит капля водки? Нисколько? Накапайте мне стаканчик...", то есть хранить цену капли водки? Она может быть меньше копейки, и это, строго говоря, уже не деньги, а, скажем так - некий финансовый показатель. Их их может быть много. Тогда точность зависит от конкретной задачи и алгоритма.
Вообще говоря, в нормальном большом бизнесе такие задачи решаются тоже без потери точности.

Просто хранят цену не как 0.0000021 р за каплю, в как 21 коп за 10000 капель. Т.е. хранят 2 числа - "сколько денег" за "сколько товара"


У меня ситуация такая. Я не отвечаю за исходную БД, где происходят финансовые операции. Я имею дело с кубами и ETL. И я не в первый раз с сталкиваюсь с ситуацией, где на 1 млн руб накапливается ошибка до 10 руб просто из-за того, что данные просуммировали в разной последовательности.

Что касается выражений, то тут может быть суммирование как самих денег SUM(Продажи * кол-во), так и деления вроде X / (Z - Y). При этом за неделю аналитики могут прислать от 3 до 10 новых формул. И непонятно, что они принесут завтра. Сейчас такий формул уже набралось >200.

Людей у нас много, и кто во что горазд. Decimal(15,2) любят ставить.

Вопрос такой, как минимизировать конвертацию?
30 июн 14, 12:27    [16237864]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Cane Cat Fisher
Member

Откуда:
Сообщений: 1809
Надо смотреть, прежде всего с точки зрения здравого смысла. Особенно это:

a_voronin
так и деления вроде X / (Z - Y).
30 июн 14, 14:13    [16238597]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
a_voronin
У меня ситуация такая. Я не отвечаю за исходную БД, где происходят финансовые операции. Я имею дело с кубами и ETL. И я не в первый раз с сталкиваюсь с ситуацией, где на 1 млн руб накапливается ошибка до 10 руб просто из-за того, что данные просуммировали в разной последовательности.

Что касается выражений, то тут может быть суммирование как самих денег SUM(Продажи * кол-во), так и деления вроде X / (Z - Y). При этом за неделю аналитики могут прислать от 3 до 10 новых формул. И непонятно, что они принесут завтра. Сейчас такий формул уже набралось >200.
Так для кубов и ETL вы ведь можете правильно проектировать модель данных?

Для умножений и суммирований погрешности быть не может, если правильно выбраны типы, а деления вроде X / (Z - Y) нужно исключать, точнее, приводить к правильному виду, переделывать на правильные формулы.

Или второй вариант - разбираться с каждым случаем и исправлять конкретные ошибки отдельно, если формулы и модель инменению не подлежит. Поскольку не может быть типов данных, которые уберут эти ошибки (разве что можно уменьшить частоту возникновения ошибок, тупо увеличивая точность).
30 июн 14, 14:30    [16238718]     Ответить | Цитировать Сообщить модератору
 Re: Какие типы данных используются для хранения денег  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
a_voronin
Я имею дело с кубами и ETL. И я не в первый раз с сталкиваюсь с ситуацией, где на 1 млн руб накапливается ошибка до 10 руб просто из-за того, что данные просуммировали в разной последовательности.
Картинка с другого сайта.
"И эти люди запрещают ковыряться в носу" ©
a_voronin
При этом за неделю аналитики могут прислать от 3 до 10 новых формул. И непонятно, что они принесут завтра. Сейчас такий формул уже набралось >200.
Что, тяжело быть кодером?
a_voronin
Людей у нас много, и кто во что горазд. Decimal(15,2) любят ставить.
Т.е. понять смысл, что вычисления не определяется типом хранения, вам таки не дано?!
a_voronin
Вопрос такой, как минимизировать конвертацию?
"нужно чутьё" © a_voronin

alexeyvg
точнее, приводить к правильному виду
Абстрактно всё это. Есть конкретные правила.


Хотя правило тупое до безобразия: Нужно чтобы на каждом этапе операции не происходило округление значения на всём заданном диапазоне значений.
Для этого, сюрприз, надо знать, как непосредственно происходит операция. a_voronin, правда неожиданно?!
Как же сложно взять открыть, да пачитать. В частности для decimal.
Ах, ну да, чукча не читатель, чукча писатель.
alexeyvg
тупо увеличивая точность
В том то и проблема, если делать это тупо, как раз можно уменьшить точность вычислений.

И да, надо понимать, каков диапазон возможных значений, в каждой задаче и этапе вычислений. И для этого надо, сюрприз, понимать предметную область.
А некоторые кодеры думают, что писать финансовые системы (в частности) - это тупо копировать ТЗ в лоб, не задумываясь, желательно тупо нажимать одну клавишу "Сделать мне хорошо", создавая при этом вид бурной деятельности.

Mnior
Нужно чтобы на каждом этапе операции не происходило округление значения на всём заданном диапазоне значений.
А помните в школе, ещё средней, как мы все решали системы уравнений, и рассчитывали допустимые диапазоны значений (ДДЗ)?! Эх было время, при этом некоторые из нас говорили ... да почти все - "Ну и зачем это нам нужно". Хотя нет, больше всего этот вопрос помнят только люди после "потерянного поколения", остальные видят это в своих детях, в молодом поколении ...


alexeyvg
точнее, приводить к правильному виду
Другое дело, как так переписать "формулу" чтобы уменьшить общую потерю точности.
Да, тут "нужно чутьё".
Не даром нас тренировали на гимнастических снарядах туче задачек.
Кому для того чтобы не просто понимать, но и быстро применять, а кому хоть как-то всунуть навыки пилотирования военным вертолетом B212.
1 июл 14, 04:12    [16241490]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить