Php TAX вычесть и добавить обратно

У меня есть магазин, где клиент вводит цену продукта с налогом в своей стране. Когда я сохраню его, мне нужно убрать налог и оставить только базу.

Когда я рассчитываю возврат налога для клиентов из одной страны, в некоторых случаях общая цена будет отличаться на 0,01, 0,03, а затем от исходной цены.

Я пробовал рассчитывать от 2 до 4 цифр, но это никогда не срабатывает во всех случаях.

Пример: цена с налогом = 157, налог 7,7% => база = 145,78 и сумма налога 11,22.

Когда я рассчитываю налог на предыдущую ценовую базу, я получаю следующее:

База: 145,78, налог 7,7% => 11,23 = цена 157,01

PHP-код, который я использую:

$baseprice = round($fullprice / (1+($taxperc/100)),2);

На интерфейсе:

$tax = round($baseprice * ( $taxperc / 100 ),2);
$total = $tax + $baseprice;

У кого-нибудь есть предложение, как это исправить?

Спасибо!

Обновление: после некоторых исследований я нашел решение - использовать раунд с PHP_ROUND_HALF_EVEN

Update2: первое решение не работает. 1-9 работает нормально, 10 - налог + налог = 10.01


person Emanuel    schedule 27.03.2018    source источник
comment
Связанный: stackoverflow.com/q/2860432/457268   -  person k0pernikus    schedule 28.03.2018
comment
Возможный дубликат Не работает ли математика с плавающей запятой?   -  person Obsidian Age    schedule 28.03.2018
comment
Вы также можете использовать денежную библиотеку, например moneyphp.org/en/latest   -  person k0pernikus    schedule 28.03.2018
comment
Проверю денежную библиотеку. Спасибо   -  person Emanuel    schedule 28.03.2018
comment
ИМО на сервере должно храниться как базовая цена, так и налог на добавленную стоимость. В противном случае проблем с округлением не удастся избежать.   -  person k0pernikus    schedule 28.03.2018
comment
Я сохраняю только базовую цену, потому что налоговая ставка время от времени меняется, и старый налог бесполезен.   -  person Emanuel    schedule 28.03.2018
comment
Вы сохраняете только текущую базовую цену на продукт. Тем не менее, в фактическом заказе, купленном покупателем, вы можете сохранить как цену, так и налог, примененные при покупке. Цены и налоговые ставки могут измениться, а заказ после того, как он был выдан, не должен.   -  person k0pernikus    schedule 28.03.2018
comment
В заказе, конечно, я храню и то, и другое, но в записи продукта я храню только базовую цену.   -  person Emanuel    schedule 28.03.2018


Ответы (2)


Сегодняшним решением было бы работать на оборотной стороне с полным количеством цифр (для базовой цены, налога и итоговой суммы) и только тогда, когда пользователь отображает его, чтобы округлить его. :)

person Emanuel    schedule 28.03.2018

Кажется (еще не уверен на 100%, мне нужно еще протестировать) решение - использовать округление банкира PHP_ROUND_HALF_EVEN

$baseprice = round($fullprice / (1+($taxperc/100)),2 , PHP_ROUND_HALF_EVEN);
$tax = round($baseprice * ( $taxperc / 100 ),2 , PHP_ROUND_HALF_EVEN);
$total = $tax + $baseprice;
person Emanuel    schedule 27.03.2018