hnwの日記

PHP5.3.0alpha3のround関数の実装がPHP5.2.6と変わった


(2016/07/02 20:00追記)本稿をさらに掘り下げた記事「PHPのround関数を読み解く (1)丸め桁数が大きすぎ・小さすぎる場合」「PHPの新しいround関数を読み解く (2)pre-roundingの意味」を書きました。合わせてご確認ください。


12月4日付でPHP5.2.7とPHP5.3.0alpha3が同時リリースされましたが、これに関連して毎度おなじみPHPのround関数の話題です。相変わらず記事は長いので簡単なまとめから。

  • PHP5.3.0alpha3ではこれまでのPHPのいずれとも違うround関数が実装されました。少々疑問は残るものの、比較的マシな実装だと僕は考えています。今回は0.50000000001のような不思議な数は含まれていませんし、問題が起こる例が以前より減ったように思います。
  • 第3引数で丸め方式を選択できるようになりました。四捨五入(デフォルト)や偶数丸めなど、4種類の丸め方式が選択可能です。

背景

以下、現時点での僕の理解を書いていきます。


PHPでは、bugs #24142への対応として、PHP 5.1.0からPHP_ROUND_FUZZという定数が導入されました。これは、10進小数で考えれば不思議な丸め結果になることへの防止策として、正の数を丸める場合であれば0.5を足してから切り捨てるはずのところを、一部環境のみ0.50000000001(fuzz)を足す、というものです(参考:「PHPの奇妙なround関数」)。浮動小数点数への理解度が低い初心者が混乱するのを防ぐための修正と言っても構わないと思います。


この実装に対し、「俺がもっとマシな実装を考えたぜ!」という人がPHP本家にhttp://wiki.php.net/rfc/roundingという文章を送りつけ、提案が採用されてPHP5.3.0alpha3から実装された、というのが今回の変更です。このままいけば、PHP5.3.0以降この実装が標準になるはずです。

続きを読む