【PHP】組み込み関数number_formatで現れる浮動小数点数

  • 2019年3月1日
  • PHP

 PHPにはnumber_formatなる組み込み関数があります。

number_format — 数字を千位毎にグループ化してフォーマットする

number_format ( float $number[, int $decimals = 0] ) : string

PHP: number_format – Manual

 number_formatは整数に区切りのカンマを入れる目的で主に使われます。これだけならば問題はないのですが時には小数を扱いたい時もあります。number_formatそのままでは少数を出力することはできません。表示を行うには第2引数に表示する少数の桁数を記述する必要があります。

 この表示する少数の桁数の指定は少数が途切れた後でも続きます。

 少数部を16桁表示する様に命令したところ、number_formatから返された文字列から読み取れる値が意図した値である1400.05と異なります。この原因には浮動小数点数が絡んでいます。
 number_formatの引数にあるfloat numberがこの現象の主な原因です。この説明にある様にnumber_formatの第1引数はいかなる値であってもfloat型、浮動小数点数に型変換されます。この変換された浮動小数点数を指定されたフォーマットに沿って返す関数がnumber_formatです。浮動小数点数はある大きさのビット(大体32ビットや64ビット)を符号部(sign)、仮数部(flaction)、指数部(exponent)に分けて、ある値をflaction^(sign*exponent))という式によって表す数です。

 浮動小数点数のこの方式は広い範囲の値を表現できますが、正確な少数を表すことがほとんどできません。最も近いそれらしい値を出力して四捨五入で見かけを整えることで対応しています。関数number_formatもこの例にもれません。1400.05はnumber_format内部では1400.05に近い何らかの数として扱われています。このため指定する少数の桁数を増やすと次の様にもっとずれていきます。

 四捨五入を行っているので次の動作も起きます。

 元の数値を文字列と扱える場合、次の様に解決できます。

 少数部を切り分けて、特定の長さになる様に右側を0埋め、最後に合体させて完成です。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG