Мультивалютность: хранить ли курс валют или сразу пересчитанное значение

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Общий принцип - рассчет денежных операций и сохранение результат делается без округления, округление делается при выводе сумм на экран.

Лучше не делать рассчеты, используя float: http://ru.php.net/ru/float

Для этого есть BCMath, оно позволяет делать рассчеты без потерь.

Если ты делаешь рассчеты с float (просто в скрипте) - после операции прибавляй 0.00001

По твоему вопросу:

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

Для оплаченного заказа храни цену в рублях и сумму фактически полученной валюты.

В базе суммы стоит хранить или в текстовом поле (varchar), или в numeric.
 

slavamakhotkin

Новичок
TutanXamoN
про банковское округление не знал, спасибо.

Мне показалось или из данной записи следует что помимо стоимости услуги в таблице "услуги", в таблице "услуги заказа" хранятся округленные стоимости под каждый заказ каждой услуги?
да. то есть 3 в нашем случае

-~{}~ 26.05.09 02:32:

grigori,
Спасибо.
А если нужно выводить в таблице эти неоплаченные заказы, значит для каждой строки нужно повторить операцию конвертирования, что и для просмотра одного заказа: получить все стоимости из базы, сконвертировать, сложить и вывести - и так, скажем, двадцать раз. Не будет ли тормозов?
 

dimagolov

Новичок
получить все стоимости из базы, сконвертировать, сложить и вывести - и так, скажем, двадцать раз. Не будет ли тормозов?
получить все стоимости из базы - тебе все равно какое число отбирать из базы (рубли или валюту), надеюсь ты можешь все цены заказа одним запросом получить.

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

и вывести - php без разницы в какой валюте выводить значения ведь :)

вопрос. каких тормозов ты боишься?
 

TutanXamoN

Новичок
slavamakhotkin
В таком случае есть некоторая ненужная избыточность.
Лучше храни только общую сумму заказа (со всеми интересными округлениями) в таблице "инфо о заказе" а в таблице "услуги заказа" только связи вида ид_заказа----ид_услуги.
На клиенте до момента оплаты просто переводишь число из инфы о заказе по курсу а после оплаты фиксируешь его.

ЗЫ: вопрос о сферическом коне в вакууме: в случае если мы округляем каждую услугу, какой смысл в хранении неокруглённых сумм в таблице "услуги"?
 

prolis

Новичок
TutanXamoN
если задумываться на несколько шагов вперед, то тебе придется проводить анализ, сверять баланс и вести претензионную работу.
Поэтому никаких иных цифр, кроме которых будут проходить по бухгалтерии(ям) быть не должно. Пересчет в неосновную валюту - только в момент заказа, на эту общую сумму и будет товарный чек.
А ещё придется хранить курсы используемых валют на каждый день (это для разборки полётов).
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
TutanXamoN
в части избыточности ты прав, стоимости услуг в заказе до их оплаты хранить не надо, надо хранить цены после оплаты
(но уже не в таблице текущих заказов)

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

slavamakhotkin
если сделать без глупостей - тормозов не будет
замерь время исполнения в цикле 10 000 операций умножения или деления

prolis
+1, но это познается только на личной практике ;)
 

slavamakhotkin

Новичок
prolis
Спасибо за идею хранить историю курсов валют.

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