2015-05-20 4 views
10

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

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

Проблема может возникать при редактировании цены продукта в бэк-офисе или когда клиент находится на этапе проверки.

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

я искал помощи на Google, и никто, казалось, не имеют этой проблемы ...

ли кто-то столкнулись с этой проблемой? Считаете ли вы, что это проблема с PHP или Prestashop? Заранее спасибо за вашу помощь.

Вот код круглой функции Prestashop использует:

round($value, 2, PHP_ROUND_HALF_UP); 

Для получения дополнительной информации, версия PHP 5.4.39.

+0

http://php.net/round - существует 4 метода округления. grep через код prestashop, чтобы узнать, какие из них они используют. –

+0

@MarcB Спасибо за ваше предложение, я обновил свой вопрос с помощью функции, используемой Prestashop. – Sebj

ответ

1

Более двух лет спустя мы выяснили проблему. Это связано с тем, что php5-fpm не обрабатывает локали на поток, а на процесс. Это действительно ясно PHP documentation:

Предупреждение Языковой информация поддерживается в процессе, а не на поток. Если вы используете PHP на API с многопоточным сервером, например IIS, HHVM или Apache в Windows, вы можете столкнуться с внезапными изменениями в настройках локали во время работы скрипта, хотя сам сценарий никогда не назывался setlocale(). Это происходит из-за того, что другие скрипты работают в разных потоках одного и того же процесса в одно и то же время, изменяя язык всей системы с помощью setlocale().

Поскольку десятичный разделитель изменился, PHP не распознал десятичные знаки и не усекал мои номера.

0

Возможно, есть проблема, если цена имеет тысячу разделителей, таких как 12,300.20?

Пожалуйста иметь в виду следующее:

Примечание: PHP не обрабатывает строки как «12,300.2» правильно по умолчанию. См. Преобразование из строк.

См: http://php.net/round

0

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

http://php.net/manual/en/language.types.float.php

Проверить это, как хорошо, объясняя, почему число с плавающей точкой всегда не равно, когда вы думаете, что они должны. http://docstore.mik.ua/orelly/webprog/pcook/ch02_03.htm#phpckbk-CHP-2-SECT-3

0

Возможно, возникнут проблемы с локалями. В немецком, например, разделители тысяч и десятичные точки - это наоборот. Если вы не очень тщательно относитесь к тем, вы можете сохранить неправильные значения в некоторой степени персистентности или сломать некоторое значение, когда бросаете его в float. Помните, что при вычислении с помощью строк (например, «2.55») php будет использовать их для float, обработка немецких чисел («2,55») приведет к неправильному числу с плавающей запятой.

(float) "2.55" = 2.55 
(float) "2,55" = 2 

Проблема может быть устранена путем правильной настройки локалей.

Если вы можете сообщить неверный результат из действительного автоматически, вам может потребоваться зарегистрировать debug_backtrace в этой точке, чтобы оценить поток программ в этом случае.

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