PHP json解码不提供原始值,它是截断的

时间:2018-03-21 04:44:10

标签: php json

我有一个字符串:

{"lat":28.67167520663993,"lng":77.23913223769534}

当我使用时:

$json = json_decode($json['latlng'] , true); 
echo "<pre>";print_r($json );

然后输出值为:

阵列:

(
    [lat] => 28.67167520664
    [lng] => 77.239132237695
)

但结果不同且被截断

我需要原创价值我该怎么办?

3 个答案:

答案 0 :(得分:2)

我以下理解的是我的意见:

1)您提供的值为float值。浮动问题不是json问题。

2)解决方法是您可以用双引号"28.67167520663993"包装您的值。它会给你正确的输出。代码如下所示

$a = '{"lat":"28.67167520663993","lng":"77.23913223769534"}';
print_r(json_decode($a,true));

3)默认情况下,我的系统中Float将循环到3 digit precision
4)防止设置ini_set('precesion',15)的另一种方法。它不会向上舍入到15位数。

<?php
ini_set('precision', 15);
$a = '{"lat":28.67167520663993,"lng":77.23913223769534}';
print_r(json_decode($a,true));

5)已报告错误here。以上是不同的预防方式,直到php为它引入一些解决方案。

答案 1 :(得分:1)

试试这个:

$json = '{"lat":28.67167520663993,"lng":77.23913223769534}';
$json = preg_replace('/:\s*(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)/', ': "$1"', $json);

$jsond = json_decode($json , true); 
echo "<pre>";print_r($jsond );

答案 2 :(得分:0)

这是数字精度的问题。除非您想自己解析JSON文件并使用GMP来处理您的值,否则您无法使用json_decode()做很多事情。

请参阅文档中的说明:https://secure.php.net/manual/en/language.types.float.php

  

警告

     

浮点精度浮点数有限   精确。虽然它取决于系统,但PHP通常使用   IEEE 754双精度格式,它将给出最大相对值   由于1.11e-16的舍入而导致的错误。非小学   算术运算可能会产生更大的错误,当然还有错误   当几个操作复合时,必须考虑传播。

     

此外,有理数的数字可以完全表示为   基数10中的浮点数,如0.1或0.7,没有   精确表示为基数2中的浮点数,即   内部使用,无论尾数的大小。因此,他们   没有a就无法转换成它们的内部二进制对应物   精度损失小。这可能导致令人困惑的结果:for   例如,floor((0.1 + 0.7)* 10)通常会返回7而不是   预期8,因为内部表示将是类似的   7.9999999999999991118 ....

     

所以永远不要将浮点数结果信任到最后一位数,不要   直接比较浮点数是否相等。如果更高   精度是必要的,任意精度数学函数和gmp   功能可用。