こんにちは、@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() を使うと、小数点以下のゼロが自動的に削除されてしまう問題があります。
特に、会計データや金額データを扱う場合は小数点以下の表示が重要 になるため、適切なフォーマットが求められます。
ほかにもたくさん便利なフラグがあるようなので、ご自身の課題解決に最適なフラグを使用してみましょう。