PHPのfloor()
関数は数値の端数を切り捨てる関数であると解説されることが多いのですが、それは果たして正しいのでしょうか。「切り捨て」と「切り下げ」の違いについて考えてみました。
floor()関数を使ってみる
PHPのfloor()
関数は小数の端数を切り捨てる関数です。マニュアルにもそう書いてあります。切り捨てだとはっきり書いております!(念押し)
やってみましょう。以下は数値3.7564
(みなごろし)に対してfloor()
関数を使った例です。
$result = floor(3.7564);
echo $result; //出力: 3
小数点以下が切り捨てられました。想定通りです。
では、-3.7564
の場合はどうでしょう。
$result = floor(-3.7564);
echo $result; //出力: -4
ん?これって切り捨てですか?思ってたのと違う。
小数点以下を切り捨てたら-3
になると思います。私はそう思います。PHPのfloor()
関数は「切り捨て」ではなく「切り下げ」をしているのではないでしょうか。
切り捨てと切り下げの違い
では「切り捨て」と「切り下げ」の違いは何なのでしょう。
切り捨てとは
切り捨てとは、端数を削除することです。
3.7564
→ 3
-3.7564
→ -3
正の数でも負の数でも、単純に端数を無視するだけです。
切り下げとは
切り下げとは、端数を削除して元の数より小さくすることです。
3.7564
→ 3
-3.7564
→ -4
正の数では切り捨てと同じ結果になりますが、負の数では異なる結果になります。
なぜfloor()は切り捨てをする関数と解説されるのか
floor()
は切り下げをする関数であるにもかかわらず、なぜ切り捨てをする関数だと解説されているのでしょうか。
- 日本語において「切り下げ」という言葉は一般的でないから?
- 正の数ならば「切り捨て」も「切り下げ」も結果は同じだから?
- 国語辞典に「切り上げ」の対義語は「切り捨て」と書いてあるから?
ちなみに、英語では切り捨てることを「truncate」と言い、切り下げることを「floor」または「round down」と言うそうです。PHPの英語版マニュアルを見るとfloor()
関数の解説は「Round fractions down」となっています。しかし、これを日本語に機械翻訳すると「端数を切り捨てる」になってしまいます。
ここに問題がありそうです。日本において、理系界隈では「切り捨て」と「切り下げ」は区別されているにもかかわらず、文系界隈ではそれらを区別せずに「切り捨て」と呼んでいるのです。
日本では「切り捨て」も「切り下げ」もまとめて「切り捨て」と呼ばれるのです。文系の浅はかさが引き起こした悲劇と言えるでしょう。
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
PHPで切り捨てをする方法
というわけで、floor()
関数で負の数を扱うときは、予想と異なる結果になることがあるので注意しましょう。
では、PHPで数値の端数を切り捨てるにはどうすればよいのでしょうか。PHPには切り捨てをするための関数は存在しません。
(int)キャストを使う
キャストとは値の型を強制的に変換することです。(int)
キャストは値を整数に変換します。このとき小数点以下は無視されるので、切り捨てと同じ結果になります。
$result = (int) 3.7564;
echo $result; //出力: 3
$result = (int) -3.7564;
echo $result; //出力: -3
intval()関数を使う
intval()
関数は値を整数に変換します。(int)
キャストの関数バージョンです。
$result = intval(3.7564);
echo $result; //出力: 3
$result = intval(-3.7564);
echo $result; //出力: -3
さいごに
以上、PHPのfloor()
関数が「切り捨て」ではなく「切り下げ」を行うことについて解説しました。
正の数だけを扱うならばどちらでも結果は同じですが、負の数を扱うならば「切り捨て」と「切り下げ」の違いを理解することはとても重要です。
でわでわ
コメント