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 なんて数字になってしまいますね。