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

Dem*_*a ツ 4 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
Run Code Online (Sandbox Code Playgroud)

但是,当小数为"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
Run Code Online (Sandbox Code Playgroud)

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

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

Dem*_*a ツ 9

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
Run Code Online (Sandbox Code Playgroud)