PHP 7.1 以降の json_encode で float の小数点以下の桁数について

API の変数の受け渡しによく使われる JSON 形式ですが、PHP 7.1 以降では、消費税率など float の浮動小数点数を json_encode で JSON 形式に変換すると、小数点以下が長くなってしまいます。

$json = json_encode(['tax_rate' => 0.08]);
echo $json

上記のコードを実行すると、tax_rate の値は 0.08 ではなく、小数点以下が56桁もある値に変換されてしまっています。

{"tax_rate":0.08000000000000000166533453693773481063544750213623046875}

serialize_precision

浮動小数点数を json_encode や serialize、var_export 関数で変換する時に、桁数を指定する設定オプションが serialize_precision になります。デフォルトでは 100 が設定されていて、このオプションを -1 にすることで数値が丸められて変換されるようになります。

$serialize_precision = ini_get('serialize_precision');
ini_set('serialize_precision', '-1');
$json = json_encode(['tax_rate' => 0.08]);
ini_set('serialize_precision', $serialize_precision);
echo $json;

そこで、上記のように json_encode の前で serialize_precision の値を -1 に設定して、json_encode の後で元に戻すようにすることで、期待する 0.08 に変換できます。

{"tax_rate":0.08}

消費税 10% の場合も、0.1 を期待したいのですが、0.1000000000000000055511151231257827021181583404541015625 なんて数字になってしまいますね。

作成者: コネタねこ

上から読んでも『コネタねこ』、下から読んでも『コネタねこ』。贈り物に悩んだら、コネタねこの小ネタ帳。欲しくなっちゃうプレゼント、そんなアイデアのぞきにきてね♪

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です