Проблема округления при расчете цен Woocommerce

У меня возникла проблема при попытке выполнить некоторые вычисления в Woocommerce, и похоже, что я получаю ошибку точности с плавающей запятой. То есть: моя конечная сумма составляет 448,99, но на самом деле мне нужно, чтобы моя сумма была 449,00.

Давайте посмотрим, как я пришел к этому расчету:

Сначала я сохраняю цены на выбранные мной варианты в массиве

$regular_price_array[$variation_key] = (float)get_post_meta($selected_variation_ids[$variation_key]['variation_id'], '_regular_price', true);

Результат:

array(6) { [64]=> float(74) [65]=> float(99) [66]=> float(89) [67]=> float(89) [68]=> float(59) [69]=> float(149) }

Затем я сохраняю свои скидки в массиве:

$variation_discount_array[$discount_key] = (float)$selected_variation_ids[$discount_key]['discount'];

Результат:

array(6) { [0]=> float(19.66) [1]=> float(19.68) [2]=> float(19.68) [3]=> float(19.68) [4]=> float(19.68) [5]=> float(19.68) }

Затем я пытаюсь произвести базовый расчет ЦЕНЫ * (1 - СКИДКА / 100), а затем складываю каждую из этих цен. Здесь и возникает проблема, я думаю, из-за точности PHP с плавающей запятой.

$discount_variation_price[$innerKey] = $reg_prices * number_format((1 - $discount/100),4);

Результат:

array(6) { [64]=> float(59.4368) [65]=> float(79.5168) [66]=> float(71.4848) [67]=> float(71.4848) [68]=> float(47.3888) [69]=> float(119.6768) } 

Если бы вы сами посчитали только на первом, вы бы увидели проблему. В конечном итоге вы получите ~ 59,45 (что составляет последний цент), но, конечно, это не сработает просто так.

Я пробовал использовать bcmath(), но при моей установке я получаю сообщение об ошибке, что эта функция не определена и не могу найти о ней много информации, поэтому я предполагаю, что эту функцию на веб-сайте WordPress использовать нечасто.

С учетом всего сказанного, я не совсем разбираюсь в этом конкретном предмете, поэтому мне интересно, как лучше всего поступить, чтобы на самом деле получить нужную мне сумму? Я в полном тупике! Спасибо!

Примечание: (float) здесь приводится к типу, но раньше, если бы я не вводил cast, только скидка была бы плавающей, а цена была бы строковой. Однако ошибка все еще оставалась, и я подумал, что, возможно, изменение обоих на поплавок поможет. Это не повлияло.

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

patrick 21.07.2018 18:59

Подробнее: msdn.microsoft.com/en-us/library/c151dt3s.aspx

patrick 21.07.2018 19:00

Привет, Патрик, спасибо за быстрый ответ! Однако я не совсем понимаю, что вы здесь имеете в виду. Кроме того, в статье я понимаю, что проблема заключается в точности с плавающей запятой, но я не совсем уверен, как подойти к этой проблеме (особенно в php).

Darthmaul 21.07.2018 19:17

Вам необходимо установить / включить расширение bcmath. У большинства хостов это должно быть включено.

Devon 21.07.2018 19:17

После того, как BC Math работал над моей установкой, я получил здесь точно такой же результат. Так что, к сожалению, я не думаю, что BC Math - правильный подход :(

Darthmaul 21.07.2018 19:55

Это связано с поведение округления при расчете цен, но не с точностью PHP с плавающей запятой в Wordpress ... Поэтому вам следует поискать поведение округления в Woocommerce. Однажды у меня была аналогичная проблема, и замена number_format() на round() решила проблему (но не уверен, что это поможет вам)…

LoicTheAztec 21.07.2018 19:56

Спасибо за предложение, Лоик, к сожалению, даже с round() у меня все еще меньше 0,01 в моих расчетах. Я ищу решения относительно общего округления Woocommerce. Спасибо

Darthmaul 21.07.2018 20:03

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

LoicTheAztec 21.07.2018 21:01

Привет, спасибо за постоянную поддержку. Прочитав все предложения и все комментарии, я не думаю, что есть решение, к которому я мог бы помочь. Я думаю, что это больше связано с рассмотрением языка / платформы, и мне, вероятно, нужно изучить другие способы выполнения того, что я делаю.

Darthmaul 21.07.2018 21:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
9
136
0

Другие вопросы по теме