PHP - 随机回合行为问题

PHP - Random round behavior issue

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

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

在后台编辑产品价格或客户在结账时可能会出现此问题。

我试图重现该问题,因此我创建了一个基本测试:我检索购物车信息并显示其价格。我刷新了很多次页面,只看到了几次四舍五入的价格。最奇怪的是,在测试开始和结束之间,上下文和代码都没有改变。

我在 Google 上搜索过帮助,但似乎没有人遇到这个问题...

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

这是 Prestashop 使用的圆形函数的代码:

round($value, 2, PHP_ROUND_HALF_UP);

相关信息,版本PHP 5.4.39.

如果价格有像 12,300.20 这样的千位分隔符,可能会有问题?

请记住以下几点:

Note: PHP doesn't handle strings like "12,300.2" correctly by default. See converting from strings.

参见:http://php.net/round

我几乎可以肯定浮点数是如何存储在您的计算机中的,或者类似的东西,这可能会为您指明正确的方向。

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

也看看这个,解释为什么浮点数在您认为应该相等的时候并不总是相等。 http://docstore.mik.ua/orelly/webprog/pcook/ch02_03.htm#phpckbk-CHP-2-SECT-3

语言环境可能存在问题。例如在德语中,千位分隔符和小数点是相反的。如果您不小心处理这些,您可能会在某些持久性中存储错误的值,或者在将其转换为浮动时破坏某些值。请记住 - 当使用字符串计算时(例如:“2.55”)php 会将它们转换为浮点数,处理德国数字(“2,55”)将导致错误的浮点数。

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

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

如果您能够自动从有效的结果中判断出错误的结果,您可能希望在该点记录 debug_backtrace 以评估该情况下的程序流程。

2 年多后,我们解决了这个问题。 这是由于 php5-fpm 不处理每个线程但每个进程的语言环境。在PHP documentation:

中真的很清楚

Warning The locale information is maintained per process, not per thread. If you are running PHP on a multithreaded server API like IIS, HHVM or Apache on Windows, you may experience sudden changes in locale settings while a script is running, though the script itself never called setlocale(). This happens due to other scripts running in different threads of the same process at the same time, changing the process-wide locale using setlocale().

由于小数点分隔符已更改,PHP 无法识别小数点并截断了我的数字。