PHP - 随机循环行为问题

时间:2015-05-20 14:01:33

标签: php prestashop prestashop-1.6

我实际上面临一个基于Prestashop的几个网站(实际上是3个)的大问题。问题是PHP或Prestashop随机将价格舍入到最接近的整数,并且不系统

大多数情况下,它应该是完美的,但有时(两个问题之间可能需要数周或数月),价格四舍五入。我的圆形模式选项被正确设置为显示两位小数。

在后台编辑产品价格或客户处于结帐步骤时,可能会出现此问题。

我试图重现这个问题,所以我创建了一个基本测试:我检索购物车信息并显示其价格。我多次刷新页面,我看到价格只有几次。最有趣的是,在测试的开始和结束之间,上下文和代码都没有变化。

我在谷歌上寻求帮助,似乎没有人有这个问题...

有人遇到这个问题吗?你认为它是PHP问题还是Prestashop问题?在此先感谢您的帮助。

以下是Prestashop正在使用的圆函数的代码:

round($value, 2, PHP_ROUND_HALF_UP);

有关信息,请参阅PHP 5.4.39的版本。

4 个答案:

答案 0 :(得分:2)

两年多以后,我们发现了这个问题。 这是由于php5-fpm没有处理每个线程的语言环境但是每个进程。在PHP documentation中非常清楚:

  

警告   每个进程维护语言环境信息,而不是每个线程。如果您在Windows上的IIS,HHVM或Apache等多线程服务器API上运行PHP,则在脚本运行时可能会遇到区域设置的突然更改,尽管脚本本身从未调用过setlocale()。这是因为其他脚本同时在同一进程的不同线程中运行,使用setlocale()更改了进程范围的语言环境。

因为小数分隔符已更改,PHP无法识别小数并截断我的数字。

答案 1 :(得分:0)

如果价格有千位分隔符12,300.20

,可能会出现问题

请注意以下几点:

  

注意:PHP不会像" 12,300.2"那样处理字符串。默认正确。请参阅从字符串转换。

请参阅:http://php.net/round

答案 2 :(得分: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

答案 3 :(得分:0)

区域设置可能存在问题。例如在德语中,数千个分隔符和小数点是另一种方式。如果你不小心处理它们,你可能会在某些持久性中存储错误的值,或者在将它转换为浮动时破坏某些值。请记住 - 当使用字符串计算(例如:“2.55”)时,php会将它们转换为浮点数,处理德语数字(“2,55”)将导致错误的浮点数。

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

可以通过正确配置语言环境来解决此问题。

如果您能够自动告知错误的结果,那么您可能希望在此时记录debug_backtrace以评估该情况下的程序流。