Хранение цены в PHP. Что лучше двойной или строка?

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

9
задан Eugene 10 August 2010 в 22:52
поделиться

7 ответов

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

26
ответ дан 4 December 2019 в 06:29
поделиться

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

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

2
ответ дан 4 December 2019 в 06:29
поделиться

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

0
ответ дан 4 December 2019 в 06:29
поделиться

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

0
ответ дан 4 December 2019 в 06:29
поделиться

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

0
ответ дан 4 December 2019 в 06:29
поделиться

Ни то, ни другое не подходит.

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

8
ответ дан 4 December 2019 в 06:29
поделиться

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

т.е. вы не хотите, чтобы 6.77 было больше, чем 12.54, и не хотите получить что-то с ценой 6.4312313141.

1
ответ дан 4 December 2019 в 06:29
поделиться
Другие вопросы по тегам:

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