Хранилище валют MySQL - PullRequest
       15

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

3 голосов
/ 25 января 2012

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

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

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

Спасибо.

Ответы [ 5 ]

3 голосов
/ 25 января 2012

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

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

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

1 голос
/ 25 января 2012

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

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

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

0 голосов
/ 25 января 2012

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

0 голосов
/ 25 января 2012

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

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

0 голосов
/ 25 января 2012

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

...