Должен ли я хранить поле PRICE как int или как float int в базе данных?

В предыдущем проекте я заметил, что поле цены хранилось как int, а не как float. Это делается путем умножения фактического значения на 100, причина заключалась в том, чтобы избежать проблем с плавающей запятой.

Является ли это хорошей практикой, которой я должен следовать, или она не нужна, и делает данные менее прозрачными?

Ответ 1

Интересный вопрос.

Я бы не выбрал float в среде mysql. Слишком много проблем в прошлом с точностью с этим типом данных.

Для меня выбор был бы между int и decimal(18,4).

Я видел целые числа примеров реального мира, используемые для представления значений с плавающей запятой. Внутренние компоненты данных JD Edwards все это делают. Количества обычно делятся на 10000. Хотя я уверен, что это быстрее и меньше в таблице, это просто означает, что нам всегда нужно CAST ints до десятичного значения, если мы хотим что-то с ними делать, особенно деление.

С точки зрения программирования я всегда предпочитаю работать с decimal по цене (или money в РСУБД, которые ее поддерживают).

Ответ 2

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

Ответ 3

Я думаю, Decimal подходит для этого использования.

Ответ 4

В то время как это избавит вас от проблем, связанных с float, если цены, сохраненные в виде целых чисел, могут привести к возникновению проблемы, когда вы в конечном итоге начисляете клиенту 100-кратную цену. Это может также запутать других программистов.

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