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

У меня есть ценовое поле/столбец (например, 15,50 долларов США), и интересно, тип данных направляющих должен быть строкой, десятичным числом или плаванием?

37
задан Andrew Marshall 17 August 2013 в 12:24
поделиться

5 ответов

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

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

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

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

45
ответ дан 27 November 2019 в 04:05
поделиться
add_column :table, :price, :decimal, :precision => 8, :scale => 2

Лучше всего использовать код, указанный выше.

53
ответ дан 27 November 2019 в 04:05
поделиться

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

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

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

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

11
ответ дан 27 November 2019 в 04:05
поделиться

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

7
ответ дан 27 November 2019 в 04:05
поделиться

Это зависит от того.

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

11
ответ дан 27 November 2019 в 04:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: