PHPのjson_encode()で小数点以下を保持するには?

Web開発
この記事は約2分で読めます。

こんにちは、@Manabu です。

最近、PHPでWebAPIを作成する機会がありました。

APIのレスポンスを作成する際、数値型のデータを小数点以下1桁まで必ず返したい場面がありました。

しかし、json_encode()を使用すると、小数点以下の0が自動的に削除され、整数として処理されてしまうことがあり、解決に時間がかかってしまったので、残しておきます。

ぜひ参考にしてください。

発生した事象

今回は、「必ず少数点以下1桁を返す」ような仕様にする必要がありました。

{
    "size": 172.0
}

上記のようなレスポンスを期待していました。

ただ、実際に返ってきたレスポンスは以下のような値です。

{
    "size": 172
}

この結果を返していた時に使用していたソースは以下のようなイメージです。

$size = 172.0;
echo json_encode(['size' => $size]);

このような使い方だと、「172」として扱われるみたいです。

解決策

今回の事象の解決策は、「JSON_PRESERVE_ZERO_FRACTION」というフラグを使用するというものです。

$size = 172.0;
echo json_encode(['size' => $size], JSON_PRESERVE_ZERO_FANCTION);

上記のように、フラグを設定するだけで、以下のような期待する結果が返ってくるようになりました。

{
    "size": 172.0
}

なぜ JSON_PRESERVE_ZERO_FRACTION が必要なのか?

PHPは float を扱う際、見た目上 不要な小数点以下の0を削除 します。

そのため、json_encode()整数とみなしてしまう ことがあります。

参考サイト

PHP: 定義済み定数 - Manual
PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites i...

まとめ

PHPで json_encode() を使うと、小数点以下のゼロが自動的に削除されてしまう問題があります。

特に、会計データや金額データを扱う場合は小数点以下の表示が重要 になるため、適切なフォーマットが求められます。

ほかにもたくさん便利なフラグがあるようなので、ご自身の課題解決に最適なフラグを使用してみましょう。