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
相关产品推荐
相关产品推荐

