Хранение цены в PHP.Какой лучше двойной или струнный? - PullRequest
9 голосов
/ 11 августа 2010

Я делал «Объект продукта» для своего приложения и настраивал атрибуты, когда внезапно я попал в атрибут цены и наткнулся на него с вопросом, какой тип лучше выбрать? Я понимаю, что для PHP это не так важно, но, скажем, для MySQL это имеет значение.
Есть предложения?

Ответы [ 7 ]

25 голосов
/ 11 августа 2010

Типы действительных чисел лучше для чисел, потому что вы можете делать с ними правильные сравнения (например, цена <10.0). Тем не менее, они создают проблемы с точностью (например, 3.0 = 2.9999999999). В этом случае лучше использовать собственный десятичный тип, но без него я бы сохранял цены в виде целого числа центов (например, 6,77 => 677), а затем делил на 100, прежде чем представлять число пользователю. Таким образом вы получаете числовые операции в базе данных и получаете точность (при условии, что точности в 1 цент достаточно).

8 голосов
/ 11 августа 2010

Не подходит ни один.

Цены должны храниться как DECIMAL или INT, потому что они имеют фиксированное количество десятичных знаков. Использование чисел с плавающей точкой не является хорошей идеей, поскольку значения округляются. Строки являются проблематичными, потому что вы не сможете делать сравнения.

2 голосов
/ 11 августа 2010

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

Помните, что вы всегда можете изменить внешний вид данных перед их представлением пользователю, используя number_format () или что-то еще.

1 голос
/ 11 августа 2010

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

т. Е. Вы не хотите, чтобы 6,77 было больше 12,54, и при этом вы не хотите что-то с ценой 6,4312313141.

0 голосов
/ 11 августа 2010

Возможно, вы захотите проверить проект Время и деньги на sourceforge.Полное раскрытие: на самом деле я не слишком много смотрел проект, но, похоже, он даст вам несколько хороших идей по поводу таких вещей.

0 голосов
/ 11 августа 2010

Лично я предпочитаю целые числа, чтобы хранить их как значение цента, 650 вместо 6,50. Простая сортировка, нет проблем с округлением и легко отображается для пользователей в любом формате.

0 голосов
/ 11 августа 2010

Вопрос, который я всегда задаю себе, рассматривая строковые или числовые (int, double и т. Д.) Типы данных: «Собираюсь ли я с ними делать математику? Если ответ «да», что я должен предположить, что это в вашем случае, я иду с числовым значением. Если ответ «нет», я выбираю строковое значение.

...