こんにちは!エンジニアのノムラです。
PHPではfloor関数で端数の切り捨てをすることができます。
この記事では、以下の内容について解説していきたいと思います。
【基礎】小数点以下を切り捨てる
【応用】桁数を指定して切り捨てる
【応用】floor関数の注意点(誤差について)
【応用】その他小数を扱う関数(切り上げ/四捨五入)
floor関数についてだけではなく、その他小数を扱う関数も紹介しているので、これを機にマスターしていきましょう!
floor関数とは
floor関数は、端数の切り捨てをする関数です。
floor関数での端数とは、小数部分です。
floor(float $数値)
引数にfloat型の数値を渡し、小数点以下を切り捨てた整数値をfloat型で返します。
floor関数で小数点以下を切り捨てる
floor関数の使い方を解説していきます。
基本的な使い方
以下にfloor関数を使用したサンプルを示します。
<?php echo floor(2.3); echo '<br>'; echo floor(3.45); echo '<br>'; echo floor(10.9); echo '<br>'; echo floor(12345.6789); ?>
2 3 10 12345
整数部分や小数部分の桁数に関わらず、小数点以下が切り捨てられ整数値が返されています。
引数がプラスの値の場合、floorは整数にキャストした時と同じ値を返します。
<?php echo floor(2.9); echo '<br>'; echo (int)2.9; ?>
2 2
「2.9」をfloorで切り捨てると「2」、整数にキャストした時も「2」になります。
マイナスの値を切り捨てる
引数にマイナスの値を指定したサンプルです。
<?php echo floor(-2.3); echo '<br>'; echo floor(-3.45); ?>
-3 -4
「floor(-2.3)」は「-3」、「floor(-3.45)」は「-4」という値が返されます。
floorは、値が小さくなる方向で小数点を切り捨てます。
そのため、小数部分がなくなって「floor(-2.3)」は「-2」、「floor(-3.45)」は「-3」にならないことに注意してください。
引数がマイナスの値の場合、整数にキャストした時とは結果が異なります。
<?php echo floor(-2.9); echo '<br>'; echo (int)-2.9; ?>
-3 -2
「-2.9」をfloorで切り捨てると「-3」ですが、整数にキャストすると「-2」になります。
桁数を指定して値を切り捨てる方法
floor関数は小数点以下を切り捨てるので、整数のN桁以下を切り捨てる、小数点第N位以下を切り捨てるというような、桁数を指定しての切り捨てができません。
ここでは、桁数を指定して値を切り捨てる方法をご紹介します。
整数のN桁以下を切り捨てる
「15123」の整数の2桁以下を切り捨てる場合のサンプルです。
<?php echo floor(15123 / 100) * 100; ?>
15100
最初に「15123 / 100」で、切り捨てたい桁以下を小数とする「15.123」という値を作ります。
その値をfloorで切り捨て、最後に100をかけて「15100」にしています。
小数点第N位以下を切り捨てる
「15.123」の小数点第3位以下を切り捨てる場合のサンプルです。
<?php echo floor(15.123 * 100) / 100; ?>
15.12
最初に「15.123 * 100」で、切り捨てたい桁以下を小数とする「1512.3」という値を作ります。
その値をfloorで切り捨て、最後に100で割って「15.12」にしています。
floor関数の注意点(誤差について)
ここまで小数点以下を切り捨ててくれる便利な関数としてfloor関数を解説しましたが、気を付けなければいけないこともあります。
まずは、次のサンプルを見てください。
<?php $num = (0.1 + 0.7) * 10; echo floor($num); ?>
7
「(0.1 + 0.7) * 10」をfloorで切り捨てるので、実行結果が「8」になると思ってしまいますが、「7」という結果になります。
これは丸め誤差によるものです。
コンピュータの内部では、数値をすべて2進数で扱いますが、10進数であれば正確な数で表せる数でも、2進数では正確に表せない数があります。
正確に表せない数はある程度の桁数で値を省略することになり、誤差が生じます。これを丸め誤差といいます。
サンプルで使用している「0.1」「0.7」は2進数で正確に表せない数の例であり、丸め誤差により$numの値は「7.999999999999…」となってしまい、予想外の結果になってしまいます。
これを回避するには、floorで切り捨てる前に文字列に変換するという方法があります。
<?php $num = (0.1 + 0.7) * 10; echo floor(strval($num)); ?>
8
strval関数は、引数の値を文字列として返します。
$numを浮動小数点数ではなく文字列で扱うことで、想定通りの「8」という結果が得られます。
その他小数を扱う関数(切り上げ/四捨五入)
PHPには、floor関数のほかにも小数点以下を切り上げてくれる関数、ceil関数や、四捨五入する関数、round関数などがあります。
これらの関数もあわせて覚えておくと便利です。
以下の記事では、floor関数、ceil関数、round関数についてまとめられているので、ぜひ参考にしてみてください!
まとめ
今回はfloor関数の使い方について、floor関数の注意点、その他小数を扱う関数について解説してきました。
消費税の計算など、小数を扱う処理はよく使用しますので使い方をしっかり覚えましょう。
floorの使い方を忘れてしまったら、この記事を思い出して下さい!