我有一个字符串:
{"lat":28.67167520663993,"lng":77.23913223769534}
当我使用时:
$json = json_decode($json['latlng'] , true);
echo "<pre>";print_r($json );
然后输出值为:
阵列:
(
[lat] => 28.67167520664
[lng] => 77.239132237695
)
但结果不同且被截断
我需要原创价值我该怎么办?
答案 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 功能可用。