php - 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 的并发模型,问题就解决了。
解决方案
语言环境在 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 编写的......)。通过一些研究,您可能会偶然发现这个网站。
最初的问题是:另一个脚本与您在同一进程中运行,在您的脚本执行时更改语言环境......即使这个其他脚本可能会将语言环境切换回其原始值,尽管它可能只是几分之一秒被更改,它仍然在进程的所有线程之间共享。
hth
推荐阅读
- php - 数据库中的信息应该显示在网站上,但不是
- react-native - 在 Redux 中推送新项目之前更新对象数组中的布尔属性
- python-3.x - *Python* 406 不可接受
- debugging - kernelbase.dll 异常代码 0xc06d007e 的文档
- php - 如何从三个不同的 sql 表中将 id 值显示到表中
- r - 使用 cbind 和循环功能制作不同的 data.frame
- rest - 我如何询问 REST 服务器它有哪些资源?
- java - 无法使用 Hibernate Spatial 将 Point 插入 mysql 数据库
- java - 每次用户单击按钮时,从 txt 或 CSV 文件中随机选择记录/行的最佳方法是什么?
- python - 如何标记 OpenCV 中两个数组中都存在的特征?