Хранилище валюты MySQL

http://www.ozzu.com/programming-forum/mysql-storing-dollar-amounts-field-type-t106432.html

Этот форум, кажется, предлагает вам хранить валюту, такую ​​​​как доллар США, в ее наименьшем общем знаменателе, то есть: центы как INT, а не DECIMAL.

Мне это кажется несколько глупым. Кто-нибудь хочет объяснить причину этого, особенно почему стоит потратить время на кодирование методов форматирования значений?

Спасибо.


person Brenden    schedule 24.01.2012    source источник


Ответы (5)


Строго говоря, хранение в виде центов проще и моделирует реальный мир. Вы действительно собираете и выплачиваете дробные суммы в долларах (1,255) или платите центами (125)? Бьюсь об заклад, вы платите и собираете в центах.

Если вы имеете дело с реальными дробями, используйте десятичные дроби, но старайтесь избегать повторяющихся дробей.

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

person Marcus Adams    schedule 24.01.2012
comment
чтобы воскресить этот ответ: во многих случаях вы имеете дело с долями копейки (например, 8% налога с продаж), так как бы вы справились с 15,9932 доллара? Вы бы округлили до 16 долларов и съели бы остаток? - person Brenden; 10.10.2013

Как уже говорили другие, потеря точности с плавающей запятой (не десятичной дробью), использование int, если ваши данные подходят, может иметь большой смысл. Форматирование его для отображения/отчетности является тривиальной проблемой по сравнению с объяснением руководству, что 8 знаков после запятой не означают точного значения....

Даже не упоминайте людей, использующих double, single и, если кто-то помнит, что это действительно взаимозаменяемо или интересно, почему, если C = A - B, то A может не равняться C + B.

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

person Tony Hopkinson    schedule 24.01.2012

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

person Scott Bonner    schedule 24.01.2012
comment
Re: Я считаю, что эффективность движка для обработки целых чисел выше, чем с плавающей запятой: обратите внимание, что DECIMAL — это тип с фиксированной запятой, а не тип с плавающей запятой; см. dev.mysql.com/doc/refman/5.6 /en/fixed-point-types.html. (Но я думаю, вы правы, что INTEGER быстрее, чем DECIMAL.) - person ruakh; 25.01.2012

DECIMAL само по себе прекрасно, но большинство языков программирования не поддерживают арифметику с фиксированной запятой (только арифметику с целыми числами и арифметику с плавающей запятой), что означает, что вашему приложению, скорее всего, придется использовать целые числа, а не значения с плавающей запятой (поскольку точечные значения не могут точно представлять 12.34, и обращение туда и обратно может привести к неверным результатам), поэтому немного сложно обрабатывать преобразования между целыми числами приложения и базой данных-DECIMAL. Но, как вы заметили, вы также должны приложить усилия, чтобы использовать подход INTEGER, поэтому, если вы предпочитаете направить свою работу на использование DECIMAL, я думаю, что это разумно на 100%.

person ruakh    schedule 24.01.2012

Хранение валюты в БД — это только (меньше) половина работы: вам нужно работать с суммами до и после. Int — это тип данных, который хорошо понимают все соответствующие среды программирования, а фиксированная точка — определенно нет.

Таким образом, хотя ваша БД может правильно добавлять значения DECIMAL, ваше приложение может этого не делать (преобразовывая его в число с плавающей запятой).

person Eugen Rieck    schedule 24.01.2012