Php json_解码是四舍五入浮动,我如何防止它?

Php json_解码是四舍五入浮动,我如何防止它?,php,json,decode,Php,Json,Decode,我有一个相当大的json文件,其中包含以下格式的坐标 "[[3.2,1],[4.8,2]]" 表示(3.2,1)和(4.8,2) 我使用这些坐标来生成D3地理地图,但当php将这些信息建模到geoJSONobject中时,我遇到以下错误: 我需要将坐标转换成一个数组,使用json\u decode。然而: json_decode("[[3.2,1],[4.8,2]]") 返回 Array ( [0] => Array ( [0] => 3

我有一个相当大的json文件,其中包含以下格式的坐标

"[[3.2,1],[4.8,2]]"
表示(3.2,1)和(4.8,2)

我使用这些坐标来生成D3地理地图,但当php将这些信息建模到geoJSONobject中时,我遇到以下错误:

我需要将坐标转换成一个数组,使用
json\u decode
。然而:

json_decode("[[3.2,1],[4.8,2]]")
返回

Array
(
[0] => Array
    (
        [0] => 3
        [1] => 1
    )
[1] => Array
    (
        [0] => 4
        [1] => 2
    )
)
我失去了小数。我怎样才能防止这种情况

编辑: 这是我作为输出得到的数据的一个例子。(它应该表示一个房间的地图,这些房间通过其用途获得密度颜色)

我可以使用
jQuery.parseJSON(data)
解析此代码,但运行以下D3代码会产生最奇怪的错误:

val(svgname).append("g")
    .selectAll("path")
    .data(geoJSONobject.features)
    .enter().append("path")
    .attr("d", path)
    ...
我想这是因为坐标数组中的引号

编辑(2)-实际解决方案 我接受的解决方案是一种变通方法,但真正的问题是本地化的php设置。使用:

echo json_encode($dataset, JSON_NUMERIC_CHECK);

在php文件中,所有问题都得到了解决。虽然我会更新这个问题,因为它仍在被研究中(如果有人会遇到这个问题)

我也遇到了同样的问题。我用followin正则表达式解决了这个问题

解决方案1

$yourJsonVariable = preg_replace('/:\s*(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)/', ': "$1"', $yourJsonVariable);
将其转换为数组

$array = json_decode($yourJsonVariable, true);
积分归此

解决方案2

您可以设置
ini\u set('precision',1)

解决方案3

$decoded = json_decode($encoded, true, null, JSON_BIGINT_AS_STRING);
注意:最后一个解决方案仅适用于PHP>5.4


您可能想看看这个

只需将值用引号括起来:
json_decode(“[[3.2”,“1”,“4.8”,“2]”)

您使用的是什么版本的PHP?我运行的是5.5.12,它将它们保留为浮点数。我不知道是什么原因导致了这种情况,但可能是一种解决方法:将它们作为字符串传递,然后在收到坐标时将它们转换为浮点数。文档()确实提到将大整数转换为浮点数,但您的看起来不是很大;)@欧文莫勒关于使用字符串的建议绝对有效。你是否对为什么会发生这种情况感到好奇是另一回事。对于
5.2.0-7.0.0alpha2
var_dump()
持有JSON的var来说很好。只需将值括在引号中:
JSON_decode('[[3.2”,“1”,“4.8”,“2]”)这是一种变通方法,而不是解决方案。它依赖于PHP和/或ECMAScript中的动态键入,其中根据上下文解释
“3.1”
3.1
。从形式上讲,JSON中的
“3.1”
是一个字符串,而
3.1
是一个浮点类型,任何与之同名的JSON解码器都应该能够对其进行解码。我想解决方案应该是使用最新版本的php。因为Tom Jenkins和其他人确认它在他们的机器上工作。很遗憾,我无法执行升级。同时,这解决了我的问题,这就是为什么我把它标记为解决方案。应该标记为正确答案!建议的解决方案1对我来说就像一个charmAfter一些测试之后,regex在引号中匹配数字
/:\s*(?!\B“[^”]*)(\-?\d+(\.\d+)([e | e][\-\+]\d+)(![^”]*\B)/
此条件将只引用尚未引用的数字
$decoded = json_decode($encoded, true, null, JSON_BIGINT_AS_STRING);