2017-08-07 7 views
2

浮動小数点数を指定すると、jsonエンコーディングとそれに続くデコードの後、変数型float(またはdouble)は時々に保存されません。PHP jsonは浮動小数点数を整数に変換することがあります

$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 

Iしたがってハードに、JSONエンコード/デコード機能の動作は、データ値に基づいていると結論しなければなりません予測し、そして最終的には非常に矛盾しています。

jsonのエンコード/デコード処理中に変数のタイプを保持する方法はありますか?

答えて

3

独自のJSON形式には、浮動小数点数と整数の概念はなく、数字だけです。これが言語に依存しないデータ形式である理由の1つです。

しかし、私は、json_encodeオプションJSON_PRESERVE_ZERO_FRACTIONがそのトリックを行うことを発見しました。

JSON_PRESERVE_ZERO_FRACTION

フロート値は常に浮動小数点値として符号化されることを保証します。 PHP 5.6.6以降で利用可能です。

これは、json_encodeにJSON記法に常に少なくとも '0'の10進数を入力させるよう強制します。

json_decodeは、10進数の数字を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 
関連する問題