首页 > 解决方案 > PHP - 浮点数 - 逗号和点问题

问题描述

我的 PHP 服务器 (5.6.40) 有问题。PHP 有时会在没有任何警告的情况下将更改为逗号。

例如:

$runTimes = 20;
$number   = 39.102564102564;

for ($i = 0; $i < $runTimes; $i++) {
    echo "<p>$number</p>";
}

显显示“39.102564102564”,但有时显示“39,102564102564”(带逗号)。这很糟糕,因为当我将这个数字插入数据库时​​,它会变为 39(不带小数)。

我试过setlocale(LC_NUMERIC, 'C')了,但没有改变任何东西。

它不会发生在我的localhost中,只发生在我的服务器上

localeconv() 打印:

Array
(
    [decimal_point] => .
    [thousands_sep] => 
    [int_curr_symbol] => 
    [currency_symbol] => 
    [mon_decimal_point] => 
    [mon_thousands_sep] => 
    [positive_sign] => 
    [negative_sign] => 
    [int_frac_digits] => 127
    [frac_digits] => 127
    [p_cs_precedes] => 127
    [p_sep_by_space] => 127
    [n_cs_precedes] => 127
    [n_sep_by_space] => 127
    [p_sign_posn] => 127
    [n_sign_posn] => 127
    [grouping] => Array
        (
        )

    [mon_grouping] => Array
        (
        )

)

编辑:

直接通过 PHP(提示)执行脚本不会发生。此问题仅通过浏览器发生(在本例中为 Firefox)

在此处输入图像描述

解决方案:我改用另一个称为 prefork MPM 的并发模型,问题就解决了。

标签: phpdouble

解决方案


语言环境在 PHP 中不是线程安全的!

https://www.php.net/manual/en/function.setlocale.php

语言环境信息是按进程维护的,而不是按线程维护的。如果您在多线程服务器 API 上运行 PHP,您可能会在脚本运行时遇到语言环境设置的突然变化,尽管脚本本身从未调用 setlocale()。这是由于其他脚本同时在同一进程的不同线程中运行,使用 setlocale() 更改了进程范围的语言环境。在 Windows 上,从 PHP 5.6.20 和 PHP 7.0.5 开始,每个线程都分别维护语言环境信息。

关于输出(更改点和逗号) - 这与 C 级别的数字到字符串的转换有关(PHP 是用 C 编写的......)。通过一些研究,您可能会偶然发现这个网站。

https://phpinternals.news/52

最初的问题是:另一个脚本与您在同一进程中运行,在您的脚本执行时更改语言环境......即使这个其他脚本可能会将语言环境切换回其原始值,尽管它可能只是几分之一秒被更改,它仍然在进程的所有线程之间共享。

hth


推荐阅读