У меня есть ценовое поле/столбец (например, 15,50 долларов США), и интересно, тип данных направляющих должен быть строкой, десятичным числом или плаванием?
В этом споре всегда есть две стороны - десятичные и целые числа. Сторонники целых чисел утверждают, что десятичные числа могут быть неточными (при выполнении преобразований) и что реализация BigDecimal содержит ошибки, иногда даже segfaulting.
Для своего собственного проекта я также взял целые числа, обернул их в пользовательский контейнер, конвертируя центы в "реальные" суммы и обратно. Сначала это выглядело неплохо, но через некоторое время стало очень громоздким в использовании - отслеживание, когда вы имеете дело с центами, когда с форматированными строками и т.д.
Затем я вернулся к десятичным числам - все время один и тот же формат, я могу легко преобразовать сумму в центы, если нужно, я получаю различные алгоритмы округления. Я гораздо больше доволен десятичными цифрами.
И чтобы ответить на вопрос о неточности десятичных дробей - погуглив, вы можете заметить, что большинство ошибок связано с преобразованием десятичных дробей в плавающие :) Как уже упоминал vise, плавающие числа не являются точными, и вы никогда не должны преобразовывать десятичную дробь в плавающую. Это самое важное, что вы должны помнить при работе с десятичными числами - вы не хотите потерять точность при преобразовании. О, и я никогда не сталкивался с ошибками в ruby 1.8.7, 1.8.7 и 1.9.1 при активном использовании BigDecimal.
add_column :table, :price, :decimal, :precision => 8, :scale => 2
Лучше всего использовать код, указанный выше.
Поплавки не точны:
0.3 - 0.2 - 0.1
=> -2.77555756156289e-17
Не используйте их, если вы не храните только значения.
Если вам нужно производить вычисления, храните цену в центах как целое число. Вы можете легко отобразить их как USD с помощью помощника.
Я рекомендую использовать целые числа для цен, если это возможно. Многие популярные программы (такие как ActiveMerchant, Money) предполагают использование целых чисел, и часто лучше хранить единицы измерения в базовой единице (например, в центах).
Это зависит от того.
Если вы выполняете расчеты по закупочным ценам, используйте десятичную дробь.
Если вы выполняете инженерную математику, используйте плавающую запятую.
Если вы просто храните данные, используйте строку.