如何在 JSON 序列化时为不同浮点字段指定独立的小数精度

通过 number_format() 对各浮点字段单独格式化,再序列化为 JSON,可实现每个字段自定义小数位数(如经纬度保留 6–8 位、高度保留 2 位),但需注意结果为字符串类型而非数字。

通过 number_format() 对各浮点字段单独格式化,再序列化为 JSON,可实现每个字段自定义小数位数(如经纬度保留 6–8 位、高度保留 2 位),但需注意结果为字符串类型而非数字。

在 PHP 中,json_encode() 默认会按数值原始精度输出浮点数,且全局配置(如 serialize_precision)无法为不同字段设置差异化精度。若需实现类似 {"latitude": 35.123000, "longitude": 41.123500, "height": 100.00} 的结构,核心思路是:在序列化前,对每个浮点字段调用 number_format() 进行显式格式化

number_format() 接收三个关键参数:待格式化的数值、小数位数、小数点符号(默认 '.')、千位分隔符(通常为空)。它返回字符串,因此格式化后的值将作为 JSON 字符串字面量输出(带引号),而非数字类型。

✅ 正确示例:

$response->payload->latitude  = number_format(rad2deg($latitude), 6, '.', '');  // → "35.123000"
$response->payload->longitude = number_format(rad2deg($longitude), 6, '.', ''); // → "41.123500"
$response->payload->height    = number_format($height, 2, '.', '');             // → "100.00"

echo json_encode($response, JSON_PRETTY_PRINT);

⚠️ 重要注意事项:

? 进阶建议:若项目中多处需此类控制,可封装为辅助方法:

function formatFloat(float $value, int $precision): string {
    return number_format($value, $precision, '.', '');
}
// 使用
$response->payload->latitude  = formatFloat(rad2deg($latitude), 6);
$response->payload->height    = formatFloat($height, 2);

总结:差异化浮点精度 JSON 输出的本质是「按需字符串化」,而非尝试修改 JSON 编码器行为。number_format() 是简洁、可靠、标准的解决方案,只需明确接受其返回字符串的语义,并在消费端做好类型适配即可。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。