こんにちは!エンジニアのオータケです。
PHP使ってますか?
Laravel使ってコードを書くのが楽しい今日このごろです。
さて今回はPHPで小数を操作するための関数round,ceil,floorなどの説明をしていきたいと思います。
この関数名を見ただけでぱっとイメージできない人はぜひこの記事をご覧ください!
まず、
・round関数の使い方
・ceil関数の使い方
・floor関数の使い方
を始めとして
・round関数にはバグがあるのか!?
といった内容にも踏み込んでいきます!
この記事を見終えることで、小数値を扱う関数の使い方やその注意点を一通り学ぶことができますよ!
四捨五入を行うround関数
まず使う
まずround関数は何をするための関数でしょうか?
すでに答え書いてますね笑
四捨五入することができる関数で、これを使うことで値を丸めることができます。
では実際に関数を使ってみましょう。
<?php $number = 1.5; echo round($number) . "\n"; ?>
実行結果:
2
まずこのサンプルでは1.5という小数値をround関数で四捨五入しています。
その結果を出力(表示)してどうなったかを確認すると「2」と表示されてますね。
しっかり四捨五入ができていることが確認できました。
では次にこの「1.5」という数値を「1.2」にしてみるとどうなるでしょうか?
<?php $number = 1.2; echo round($number) . "\n"; ?>
実行結果:
1
はい。実行結果は「1」になりました。
これも正しい結果ですね。「四捨」なので切り捨てて1になっています。
round関数の引数に四捨五入したい値を渡すだけで、四捨五入した結果を戻り値として返してくれます。
ここで勘が良い方だと「小数点第二位や小数点第三位で四捨五入したいけどできるの?」といったことを思うかもしれません。
結論からいうとできます。
ではその部分については次の項で解説していきましょう。
丸める桁数を指定
先程は引数に四捨五入したい小数値を渡すだけでした。
今度は第二引数にもうひとつ値を渡して丸める桁を自分で決められるようにしましょう。
ではサンプルコードを見てみましょう。
<?php $number = 1.58; echo round($number, 1) . "\n"; ?>
実行結果:
1.6
このサンプルでは$numberには「1.58」という数値が入っていることと、round関数の第二引数に「1」という数値を渡しています。
これが先程との違いです。
そしてその実行結果を見ると「1.6」となっていますね。
つまりどういうことが起きたのかというと、第二引数で指定した1は小数点第二位である8を基準に四捨五入したということになります。
ではこの第二引数に今度は0を渡すとどうなるかやってみましょう!
<?php $number = 1.58; echo round($number, 0) . "\n"; ?>
実行結果:
2
0を指定した場合、小数点第一位である5を基準に四捨五入しています。
そのため、実行結果では2が表示されています。
ちょっとこのあたりややこしいですよね。
間違えないように覚えておきましょう。
この章では四捨五入について扱ってきました。
次の章では小数値を「切り上げ」したい場合に利用するceil関数について解説していきます。
切り上げを行うceil関数
小数値を切り上げたい場合はceil関数を使います。
細かい説明はあとにしてまずはサンプルコードを見てみましょう。
<?php $number = 1.58; echo ceil($number) . "\n"; ?>
実行結果:
2
今回も前章と同様のサンプルを使って解説します。
先に伝えておくべき点として、ceil関数は第二引数がありません。
つまり、第一引数に数値を与えた時点で小数点以下の数値が0でなければ切り上げになります。
今回の場合、1.58を代入していますが切り上げて2になっていますよね?
例えば、次のような場合は切り上げの対象にはなりません。
<?php $number = 3.0000; echo ceil($number) . "\n"; ?>
実行結果:
3
この場合は切り上げることにはならないためそのまま3が返ってきます。
ceil関数の使い方、知識というよりは切り上げについて誤解がないようにする必要があります。
この章では切り上げについて取り扱ったので次の章では切り捨てについて扱います。
切り捨てを行うfloor関数
切り捨てではfloor関数を使います。
こちらもサンプルを見てみましょう。
<?php $number = 1.58; echo floor($number) . "\n"; ?>
実行結果:
1
はい、切り捨てなので結果は1になります。
使い方自体はとても簡単ですよね?
このfloor関数やceil関数では戻り値に少しクセがあります。
floor関数を実行時に何らかの原因でエラーが発生した場合は戻り値にFALSEを返すという仕組みになっています。
例えば、どういったシチュエーションが考えられるかというと引数に配列変数を指定するとFALSEが返ってきます。
(ちなみにオブジェクトを渡すと警告が、nullを渡すと0が返ってきます。)
※公式ドキュメント上のceil関数では戻り値がfloatであることが書かれていますが実際に配列変数を与えて戻り値を確認してみるとFALSEが返ってくるようです。
roundにはバグがある?
round関数にはバグがあるのではないかといった話をたまに聞きます。
一部の古いバージョンのPHPではround関数に特殊な実装がされており、それによって起こる問題のようです。(PHP5.2.6)
詳しい情報は次のサイトが詳しく解説しており参考にしてみると良いかと思います。
PHPの奇妙なround関数
http://d.hatena.ne.jp/hnw/20070515
また、小数値自体を扱うようなプログラムを書く際には丸め誤差に注意をする必要があるためこの点も同時に理解しておく必要があります。
PHPの少数演算における切り上げ切捨て問題
https://www.psi-net.co.jp/blog/?p=277
まとめ
いかがだったでしょうか?
四捨五入をするround関数
切り上げをするceil関数
切り捨てをするfloor関数
これらの関数を使うことで小数値をいろいろ操作できます。
使い方も簡単なので覚えられますよね?