
在 PHP 中,json_encode() 默认不保留小数位数,且全局 serialize_precision 无法按字段定制精度;通过 number_format() 预处理各字段可实现差异化精度控制,但需注意结果为字符串类型。
在 php 中,`json_encode()` 默认不保留小数位数,且全局 `serialize_precision` 无法按字段定制精度;通过 `number_format()` 预处理各字段可实现差异化精度控制,但需注意结果为字符串类型。
当需要对 JSON 输出中不同浮点字段(如地理坐标与高度)应用各自独立的小数位数时,不能依赖 ini_set('serialize_precision', N)——该设置仅影响所有浮点数的全局显示精度,且无法区分字段语义。正确做法是在序列化前,对每个字段单独格式化。
使用 number_format() 是最直接、可靠的方式。它接受四个参数:数值、小数位数、小数点符号、千位分隔符(后两者通常省略)。例如:
$response->payload->latitude = number_format(rad2deg($latitude), 6); // 保留6位小数 $response->payload->longitude = number_format(rad2deg($longitude), 6); // 同样6位 $response->payload->height = number_format($height, 2); // 仅2位(如"100.00")
执行 json_encode($response, JSON_PRETTY_PRINT) 后将输出:
{
"latitude": "35.123000",
"longitude": "41.123500",
"height": "100.00"
}
⚠️ 关键注意事项:
- number_format() 返回的是字符串,而非数字。这意味着生成的 JSON 字段值是字符串类型(带引号),而非 JSON 数字。若下游系统严格要求数值类型(如某些强类型前端解析器或数据库导入工具),需提前协商或改用自定义 JSON 编码器(如继承 JsonSerializable 并手动控制格式)。
- 不要尝试 (float)number_format(...) —— 这会立即丢失格式化效果,还原为无精度保障的浮点数。
- 若需保持数值类型,唯一标准方案是使用支持字段级精度的第三方序列化库(如 symfony/serializer 配合自定义 normalizer),但会显著增加复杂度;对于大多数 API 场景,字符串形式的高精度表示(如 "35.123000")完全满足精度传递与可读性需求。
综上,按字段调用 number_format() 是简洁、可控、无需额外依赖的最佳实践。










