PHP json有时会将浮点数转换为整数

时间:2017-08-07 09:44:57

标签: php json

给定一个浮点数,在json编码和后续解码之后,变量类型float(或double)有时它不被保留。

$n1 = 1.23;
$json = json_encode($n1); // '1.23'
$n2 = json_decode($json);

$t1 = gettype($n1); // 'double'
$t2 = gettype($n2); // 'double'

$d = $n1 === $n2; // true

然而,当小数位数是' 0'结果不同:

$n1 = 1.0;
$json = json_encode($n1); // '1'
$n2 = json_decode($json);

$t1 = gettype($n1); // 'double'
$t2 = gettype($n2); // 'integer'

$d = $n1 === $n2; // false

我必须得出结论,json编码/解码函数的行为是基于数据值的,因此难以预测,最终非常不一致。

有没有办法确保在json编码/解码过程中保留变量的类型?

1 个答案:

答案 0 :(得分:7)

JSON格式本身没有浮点数和整数的概念,只有数字。这是它与语言无关的数据格式的原因之一。

但是,我发现json_encode选项JSON_PRESERVE_ZERO_FRACTION可以解决问题。

  

JSON_PRESERVE_ZERO_FRACTION

     

确保浮点值始终编码为浮点值。   自PHP 5.6.6起可用。

它迫使json_encode始终至少放置一个' 0'十进制数字到JSON表示法。

json_decode本身能够将具有十进制数字的数字解释为float,并且它不需要任何特殊标记。

$n1 = 1.0;
$json = json_encode($n1, JSON_PRESERVE_ZERO_FRACTION); // '1.0'
$n2 = json_decode($json);

$t1 = gettype($n1); // 'double'
$t2 = gettype($n2); // 'double'

$d = $n1 === $n2; // true