2015-12-10 3 views
0

Я пытаюсь найти лучший способ рассчитать цены и итоги корзины. Все цены на продукцию представлены цифрами с 2 десятичными знаками, однако при добавлении скидки в корзину, скажем, на 50%, эта цена, например, составляет 37,27 долл., При этом цифра составляет 18,635 долл. США с 3 десятичными знаками. Теперь я хотел бы, чтобы вычисления были точными, но округление 3 десятичных числа не всегда дает ожидаемый результат.Корзина покупок

Сценарий

У меня есть 5 продуктов в моей корзине со следующими, оригинальные цены:

  • $ 80,00
  • $ 189,62
  • $ 37,27
  • $ 43,75
  • $ 105.34

Давать нам в общей сложности $455.98

Когда я добавить глобальную скидку в размере 50% - доведя фигурок выше, это дало бы мне $227.99. Теперь это будет нормально работать, если мне не нужно будет получать цифру для каждого элемента после того, как была применена скидка - и это тот случай, когда я хочу передать элементы в PayPal Express Checkout. Запрос будет терпеть неудачу, если общая сумма равна сумме всех предметов в корзине.

Приведенные выше цифры после деления каждая на 2 (50%) являются:

  • $ 40,00
  • $ 94,81
  • $ 18,635
  • $ 21,875
  • $ 52,67

дает нам точно то же общее количество, когда мы делим общую сумму на 2. Проблема заключается в том, что я не хочу 3 десятичных цифр в моей корзине, поэтому округление их результат становится:

  • $ 40,00
  • $ 94,81
  • $ 18,64
  • $ 21,88
  • $ 52,67

, который добавляет до $228, который при умножении на 2 дает нам другую фигуру, которую мы первоначально имели в корзине без скидки b .

Каков наилучший способ справиться с такими сценариями?

+0

Не рассчитывайте с округленными номерами ... Сохраняйте номера оригиналов и рассчитывайте их с помощью этих параметров. – Naruto

+0

Ну, это не всегда вариант, когда вы можете показывать только 2 десятичных знака на сайте. –

+0

Чтобы ответить на более широкий вопрос: либо рассчитать цену после скидки во втором способе, либо показать это клиенту «Итого после скидки: $ 288,00» или просто отправить paypal на один объект с заказом и связанную с ним стоимость - нет конкретных необходимо подробно рассказать о каждом продукте – Steve

ответ

1

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

Причина: кому-то в какой-то момент потребуется четкая сумма, взимаемая за каждый продукт. И подумайте о возврате. его попытка сделать возврат намного проще, если вам не нужно исправлять 0,01 различия.

+0

Спасибо @cartalot - то, что я закончил, в конечном итоге заключалось в том, чтобы запускать каждый продукт через процент скидки и округлять выход каждого из них до двух десятичных знаков. После этого я получил промежуточные итоги от продуктов со скидкой. –

0

Вы можете использовать bcmul(), он гарантирует, что ваши номера точны.

Если вы хотите, чтобы цены всегда имели две десятичные точки, вы можете использовать number_format().

http://php.net/manual/en/function.bcmul.php

http://php.net/manual/en/function.number-format.php

+0

Я использую number_format() с двумя десятичными знаками, и это то, что вызывает настоящую проблему. Я посмотрю на bcmul() и посмотрю, какой результат я выберу. –

+0

Ну, как правило, вы должны использовать 'number_format' только после того, как математика была применена, в качестве средства, чтобы убедиться, что она имеет 2 десятичных знака, так как' 10.1' (например) не будет иметь конечный ноль. – Ian

+0

Я пробовал 'bcdiv' делить данную цифру на 2 (50%), но это просто сокращает третью десятичную цифру, фактически не округляя ее, поэтому в конце я получаю результат ниже оригинала, поэтому не совсем набор функций для того, что мне нужно. Я не думаю, что есть какой-то иной способ, кроме как позволить ему хранить больше десятичных знаков или просто получить общее количество после того, как все последующие продукты будут иметь цену, округленную после скидки. –

Смежные вопросы