You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中json_decode解析经纬度值被截断,如何保留原始值?

解决PHP json_decode解析浮点数时的精度丢失问题

嘿,这个问题我之前也碰到过!其实根源是PHP的float类型精度限制导致的,不过有几个简单的办法能帮你保留原始数值:

为什么会出现数值截断?

PHP里的float是双精度浮点数,它的有效数字范围大概在15-17位左右。你提供的lat值28.67167520663993刚好有16位有效数字,接近了float的精度阈值,所以存储时会被近似处理,最终输出就出现了截断的情况。

解决方案

方案1:将浮点数解析为字符串(最直接)

通过正则表达式把JSON中的浮点数替换成带引号的字符串,再用json_decode解析,就能完全保留原始数值:

$jsonStr = '{"lat":28.67167520663993,"lng":77.23913223769534}';
// 把JSON中的浮点数转为字符串格式
$jsonStr = preg_replace('/(\d+\.\d+)/', '"$1"', $jsonStr);
$json = json_decode($jsonStr, true);

echo "<pre>";
print_r($json);

输出结果会是:

Array
(
    [lat] => 28.67167520663993
    [lng] => 77.23913223769534
)

这样lat和lng会以字符串类型存储,完美保留原始值。

方案2:使用高精度数学扩展(需数值计算时)

如果后续需要对这些数值进行计算,不想用字符串处理,可以借助PHP的BCMath或GMP扩展来处理高精度数值。比如先把字符串转成BCMath支持的数值:

// 基于方案1得到的字符串值
$lat = $json['lat'];
// 用BCMath进行加法示例,保留16位小数
$newLat = bcadd($lat, '0.00000000000001', 16);
echo $newLat; // 输出28.67167520663994

总结

  • 只是需要展示或存储原始值:用方案1转成字符串最省心
  • 需要进行高精度数值计算:结合方案1+BCMath/GMP扩展处理

内容的提问来源于stack exchange,提问作者Manjeet Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:30:56