アフィリエイト広告を利用しています

広告

posted by fanblog

【PHP】number_formatの四捨五入を防ぐ考え方

PHPのnumber_format関数は数字を千の位毎にグループ化してフォーマットする関数です。
数値にカンマをつけたい、そんな場合に利用する関数です。

ただ、小数を含むフォーマットの場合には注意が必要です。number_format関数内で丸め(四捨五入)が働きます。
echo 12339960/1000;
結果は12339.96です。
12,339.9」と表示させたいのですが、number_formatではうまくいきません。
echo number_format(12339960/1000,1);
結果は12,340.0です。




number_formatの挙動は以下の通りです。
echo number_format(12339960/1000);
結果は12,340です。
これは、下の0を小数の桁として指定した場合と同等です。
echo number_format(12339960/1000,0);
結果は12,340です。
小数第一位で四捨五入されていますね。
ちなみにnumber_format(1.4)は1、number_format(1.5)は2という結果になります。

echo number_format(12339960/1000,1);
結果は12,340.0です。
1を小数の桁と指定した場合、小数第二位で四捨五入されます。

echo number_format(12339960/1000,2);
結果は12,339.96です。
2を小数の桁と指定した場合、小数第三位で四捨五入されます。


number_formatの四捨五入を防ぐ考え方


四捨五入の対象となる位を切り捨てします。これで四捨五入を防げます。
小数の桁サンプルソース
小数の桁0echo number_format(floor(1.5));
floorで1.5→1にしています
小数の桁1echo number_format(floor(1.55*10)/10,1);
floorで15.5→15、1.5に戻しています
小数の桁2echo number_format( floor(1.555*100)/100,2);
155.5→155、1.55に戻しています
小数の桁3echo number_format( floor(1.5555*1000)/1000,3);


つまり、こんな関数を用意すれば解決できます。
function my_format( float $num,int $decimals = 0,?string $decimal_separator = ".",?string $thousands_separator = ","): string{
$rate = pow( 10, $decimals);
return number_format( floor($num*$rate)/$rate , $decimals, $decimal_separator,$thousands_separator);
}


echo my_format( 12339960/1000,1 );
結果は12,339.9です。四捨五入されずに、求めている結果になりました


まとめ:正の値はこれでいけます。負の値は危険かも?


正の値はこのロジックで大丈夫だと思います。負の値は、floorの挙動に納得できるなら大丈夫ですが、求めているのと違う場合、正と負で処理を切り分ける等の修正が必要です。
echo floor(4.3);   // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4

 

  • 初期費用0円(2022年8月4日に撤廃)
  • 安定したサイト運営が可能(CPU/メモリ リソース保証 6コア/8GB〜)
  • 契約中は独自ドメインつき 独自ドメイン永久無料特典があります
  • 最大10日間無料で、サーバーのお試し利用ができます
  • ディスクキャッシュも高速 NVMe SSDを採用(300GB〜)
  • 大量アクセスでも安心 転送量は無制限

 

 

posted by scripts at 13:30 | Comment(0) | TrackBack(0) | php
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/12326882
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
最新記事
最新コメント
タグクラウド
カテゴリアーカイブ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。