Тип строки, десятичного числа или типа с плавающей запятой для поля цены? - PullRequest
37 голосов
/ 17 июня 2010

У меня есть поле цены / столбец (например, 15.50 USD), и мне интересно, должен ли тип данных Rails быть строковым, десятичным или плавающим?

Ответы [ 5 ]

53 голосов
/ 17 июня 2010
add_column :table, :price, :decimal, :precision => 8, :scale => 2

Код выше будет вашим лучшим выбором.

45 голосов
/ 18 июня 2010

Этот аргумент всегда имеет две стороны - десятичные и целые числа. Сторонники целых чисел утверждают, что десятичные дроби могут быть неточными (при выполнении преобразований) и что реализация BigDecimal содержит ошибки, иногда даже segfaulting.

Для моего собственного проекта я также взял целые числа, обернул их в специальный контейнер, конвертировал центы в «реальные» суммы и обратно. Сначала это казалось хорошим, но через некоторое время стало очень громоздким в использовании - отслеживание при работе с центами, при форматированных строках и т. Д.

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

И чтобы решить проблемы с точностью до десятичных знаков - при поиске в Google вы можете заметить, что большинство ошибок связано с преобразованием десятичных знаков в числа с плавающей точкой :) Как уже упоминалось, тиски не являются точными, и вы никогда не должны преобразовывать свои десятичные числа в число с плавающей точкой. Это единственная самая важная вещь, которую вы должны помнить при работе с десятичными числами - вы не хотите терять точность при преобразованиях. Да, и я никогда не сталкивался с ошибками в ruby ​​1.8.7, 1.8.7 и 1.9.1 при широком использовании BigDecimal.

11 голосов
/ 18 июня 2010

Поплавки не точны:

0.3 - 0.2 - 0.1
=> -2.77555756156289e-17

Не используйте их, если только вы не храните значения.

Если вам необходимо произвести вычисления, сохраните цену в центах как целое число. Вы можете легко отобразить их как доллары США с помощником.

10 голосов
/ 17 июня 2010

Это зависит.

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

7 голосов
/ 17 июня 2010

Я рекомендую использовать целые числа для цен, если это возможно.Многие популярные драгоценные камни (такие как ActiveMerchant, Money) предполагают использование целых чисел, и часто лучше хранить единицы измерения в базовой единице (такой как центы).

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