PHP使用json_encode正确的处理浮点数负零的情况

例如这段代码:

1
2
3
4
5
6
7
8
<?php

$array = [-0.0, 0.0];
var_dump($array);
$json = json_encode($array);
var_dump($json);
$array = json_decode($json);
var_dump($array);

执行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
array(2) {
[0]=>
float(-0)
[1]=>
float(0)
}
string(6) "[-0,0]"
array(2) {
[0]=>
int(0)
[1]=>
int(0)
}

我们发现,先json_encodejson_decode是不能够还原的。而且value也从float变成了int。这是因为我们在json_encode没有去保留ZERO FRACTION。所以,正确的做法应该是这样的:

1
2
3
4
5
6
7
8
<?php

$array = [-0.0, 0.0];
var_dump($array);
$json = json_encode($array, JSON_PRESERVE_ZERO_FRACTION);
var_dump($json);
$array = json_decode($json);
var_dump($array);

执行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
array(2) {
[0]=>
float(-0)
[1]=>
float(0)
}
string(10) "[-0.0,0.0]"
array(2) {
[0]=>
float(-0)
[1]=>
float(0)
}

我们在encode的时候加上JSON_PRESERVE_ZERO_FRACTION,就会让得到的json字符串保留浮点数的.0,这样在decode的时候,就可以顺利的还原了。