PHP 的 precision 配置控制浮点数输出的有效数字位数(默认14),影响 echo 等字符串化行为,需在 php.ini 中设置并重启 PHP-FPM;它不改变计算精度,也不影响 json_encode(应调 serialize_precision)或 printf。

PHP 的 precision 配置控制的是浮点数输出时默认显示的小数位数(不是计算精度),在 Trea(应为 Traefik?但结合上下文实际指代的是 PHP 运行环境,常见于 Docker + PHP-FPM + Traefik 架构中)里改它,本质是改 PHP 的配置,和 Traefik 本身无关——Traefik 不解析或干预 PHP 的 precision 设置。
php.ini 里改 precision 最直接有效
这是唯一影响全局浮点数字符串化行为的配置项。默认值通常是 14,意味着 echo 1.23456789012345 可能输出 1.2345678901235(四舍五入到 14 位有效数字,非小数位)。
-
precision控制的是「有效数字位数」,不是「小数点后几位」;比如0.00123456789012345在precision=14下会显示为0.0012345678901235 - 修改位置:容器内
/usr/local/etc/php/php.ini(Alpine/Debian 官方镜像路径)或挂载的自定义php.ini - 写法:
precision = 10(设为 10 位有效数字),然后重启 PHP-FPM 进程(kill -USR2 1或重启容器) - 验证方式:
php -i | grep precision或运行
运行时用 ini_set() 临时覆盖(不推荐用于全局)
适合单个脚本微调输出,但无法改变 JSON 编码、var_dump 等底层行为(它们可能绕过 ini_set)。
-
ini_set('precision', '10');必须在浮点数被字符串化前调用 - 对
json_encode()无效:JSON 扩展有自己的精度逻辑,受serialize_precision(PHP 7.1+)或serialize_precisionini 值影响 - 对
printf('%f', $x)也无效:格式化函数走的是自己的规则,和precision无关
注意 serialize_precision 和 JSON 场景
如果你发现 API 返回的 JSON 浮点数精度异常(比如 1.1 变成 1.1000000000000001),真正该调的是 serialize_precision,不是 precision。
立即学习“PHP免费学习笔记(深入)”;
-
serialize_precision = -1(PHP 7.1+ 推荐)表示使用机器可精确表示的最短字符串(避免无意义尾随数字) -
serialize_precision = 17是旧默认值,可能导致冗余精度 - 这个值同样要写进
php.ini,且需 PHP ≥ 7.1;Docker 中可在docker-php-ext-install后追加echo "serialize_precision = -1" >> /usr/local/etc/php/conf.d/zz-precision.ini
真正容易被忽略的是:改了 precision 并不会让 0.1 + 0.2 == 0.3 成立——浮点计算误差依然存在,它只影响「怎么显示」。如果业务依赖精确小数(如金额),必须用 string 或 BCMath,而不是调 precision。











