こんにちは。いっとくです!
プログラミングは奥が深くて楽しいですね〜
楽しすぎて仕事中も遊びの延長みたい。お金もらっていいんですか??という気持ちなのですが、そこは好みの問題なので人によるだろうし、お金は絶対にください。
さて本日はPHPで小数を四捨五入したり、切り上げたや切り捨てを行う方法と、その注意点についてのお話です!
僕が仕事で運用しているサイトでは、頻繁に使う操作という訳ではないのですが、サイトにあるページャがちょっとおかしい挙動をしていたのでみてみたところ、初見の挙動があったので共有です!
前置きはこのくらいにして、まずは小数を丸める方法から。
PHPで小数を丸める方法
小数を四捨五入するときはround、切り捨てるときはfloor、切り上げるときはceilという関数がそれぞれ用意されているのでそちらを利用します。
実際のコードで書くと以下の通り。
<?php
$number = 1.1;
// 四捨五入
$round = round($number);
// 切り捨て
$floor = floor($number);
// 切り上げ
$ceil = ceil($number);
echo $round; // 1
echo $floor; // 1
echo $ceil; // 2
うん。ぱっと見だと超絶シンプルな動きをしており、早速作業に戻りたいところですね。
関数名も
四捨五入 => 丸める => round
切り捨てる => 床 => floor
切り上げる => 天井 => ceil
と、意味がわかりやすいので非常に覚えやすい。
しかし、ここで取得した値を使う際はちょっと気をつけないといけないことがあるんです。
round、floor、ceilのような小数を丸める関数は戻り値に注意
早速ですが、例えば以下のような処理を書いた場合は気をつけた方がいい。
<?php
$number = 1.1;
$floor = floor($number);
// よし、これで1になったから、そこだけ分岐させて別の文字列を入れよう…
if ($floor === 1) {
$page = '1ページ目';
} else {
$page = '1ページ目じゃないよ!' . $floor . 'ページ目だよ!';
}
echo $page; // 1ページ目じゃないよ!1ページ目だよ!
小数は切り捨てられて1になったはずなのに、なぜか1と判定されず、意図しない方に分岐しましたね。
「1ページ目じゃないよ、1ページ目だよ!」なんて、一体誰が使うんだよってくらいの滑りフレーズですよ、恐ろしい。
ということで原因を検証!
最初に書いたコードの値をvar_dumpで調べてみると、、、
<?php
$number = 1.1;
$round = round($number);
$floor = floor($number);
$ceil = ceil($number);
var_dump($round, $floor, $ceil);
// 出力結果:float(1) float(1) float(2)
おやおや…型がintではなくfloatになっているではないか!
つまり、ぱっと見は整数っぽく見えても、型が違うため、===で型まで比較してしまうと意図しない結果になってしまうというわけです。
なので、これらの小数を丸める系の関数を使用したときは、取り出した値をきちんと整数型にキャストしてあげるか、==を使って値だけを比較してあげると良さそうです。
しかし個人的には、比較演算では型まで比較したい派なので、しっかりキャストしてから使う方がいいのでは、と思っています。
厳密比較の方がいいという事についての詳しい理由は、また別の記事で書いたので、参考までに。
値を使うときって、まず出力して中身を確認することも多いと思うのですが、型までは見ずにそれっぽい値が入っているかだけ確認して使う僕みたいなせっかちエンジニアもいるかと思うので、これらは注意して使いたい関数ですね!
以上、いっとくでした!
おしまい!
コメント