Строковый, десятичный или плавающий тип данных для поля цены?

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

Ответ 1

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

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

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

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

Ответ 2

add_column :table, :price, :decimal, :precision => 8, :scale => 2

Приведенный выше код будет вашим лучшим выбором.

Ответ 3

Это зависит.

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

Ответ 4

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

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

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

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

Ответ 5

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