У меня возникла проблема при попытке выполнить некоторые вычисления в 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, только скидка была бы плавающей, а цена была бы строковой. Однако ошибка все еще оставалась, и я подумал, что, возможно, изменение обоих на поплавок поможет. Это не повлияло.
Подробнее: msdn.microsoft.com/en-us/library/c151dt3s.aspx
Привет, Патрик, спасибо за быстрый ответ! Однако я не совсем понимаю, что вы здесь имеете в виду. Кроме того, в статье я понимаю, что проблема заключается в точности с плавающей запятой, но я не совсем уверен, как подойти к этой проблеме (особенно в php).
Вам необходимо установить / включить расширение bcmath. У большинства хостов это должно быть включено.
После того, как BC Math работал над моей установкой, я получил здесь точно такой же результат. Так что, к сожалению, я не думаю, что BC Math - правильный подход :(
Это связано с поведение округления при расчете цен, но не с точностью PHP с плавающей запятой в Wordpress ... Поэтому вам следует поискать поведение округления в Woocommerce. Однажды у меня была аналогичная проблема, и замена number_format() на round() решила проблему (но не уверен, что это поможет вам)…
Спасибо за предложение, Лоик, к сожалению, даже с round() у меня все еще меньше 0,01 в моих расчетах. Я ищу решения относительно общего округления Woocommerce. Спасибо
Проблема с кодом в вашем вопросе заключается в том, что его невозможно проверить, чтобы воспроизвести вашу проблему ... Помните, что «Вопросы, требующие помощи по отладке (« почему этот код не работает? ») Должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для его воспроизведения в самом вопросе ".. ... Поэтому вам следует попытаться добавить весь необходимый код в свой вопрос, чтобы сделать его действительно тестируемым.
Привет, спасибо за постоянную поддержку. Прочитав все предложения и все комментарии, я не думаю, что есть решение, к которому я мог бы помочь. Я думаю, что это больше связано с рассмотрением языка / платформы, и мне, вероятно, нужно изучить другие способы выполнения того, что я делаю.






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