PHPにおいて、小数点以下の端数を切り上げた数値にする関数がceilです。機能だけ見るとシンプルな関数ですが、注意が必要な点があり、また、いろいろな数値計算に応用できるをご存じでしょうか。今回は、ceil関数の基本と、数値計算に応用した使い方を紹介します。
目次
ceil関数の基本
PHPのceil関数は、引数に指定された浮動小数点数の小数点以下を切り上げし、その数を返す関数です。なお、PHPの便利な点は、変数の型宣言が不要で、同じ変数を文字列としても数としても扱える点です。今回紹介するceil関数は、浮動小数点数を扱う関数ですが、その出力は整数としても文字列としても使えます。
とはいえ、ceilの引数や出力の変数型を正しく理解していないと、PHPの処理によっては正しく動作しないこともあります。そこで、次からceil関数の文法や基本的な使い方を紹介します。
そもそもceilとはどんな意味
PHPには、英単語がそのままコマンド名として使われるケースがたくさんあります。今回紹介するceilコマンドも、英単語がそのままコマンド名に採用されました。
なお、英単語のceilとは、「天井に張る」という意味です。部屋の天井に取り付ける照明器具を、シーリングライトと呼ぶのをご存じでしょうか。シーリングは、ceilの名詞形の「ceilng」で、天井という意味です。
そのため、ceilには、数値を切り上げするという意味でも使われることから、関数名としても使われています。
PHPのceilコマンドの文法
PHPで数値を切り上げする関数、ceil関数の文法は次のとおりです。
1 |
ceil ( 数値 ); |
引数で指定する数値はfloat型、すなわち浮動小数点数です。また、ceil関数の出力も浮動小数点数です。なお、PHPの変数は、大抵の場合、変数の型を意識する必要はありません。しかし、プログラムによっては、ceil関数の出力を整数型や文字列に変換が必要なケースもあります。
ceil関数を使った簡単な例
1 2 3 4 5 |
<?php $pai = 3.14; $out = ceil($pai); echo $out . "\n"; // 出力結果は4 ?> |
引数が数値でなかった場合
先ほど説明したように、ceil関数は、引数に浮動小数点数を指定すると、それを小数点の位置で切り上げした数値を返します。しかし、数値以外を指定してもエラーにはなりません。
例えば、falseやnull、空文字などが指定された場合、ceil関数は0を返します。そのため、ceil関数に利用する変数の作成に失敗しても、エラーやワーニングが表示されません。
そのため、PHPでceil関数を利用する場合、事前に引数の値をチェックし、数値であることをチェックしてから、ceil関数で計算する、といったプログラムを検討してください。
引数が数字でなかった場合の例
1 2 3 4 5 |
<?php $in = null; $out = ceil($in); echo $out . "\n"; // 出力結果は0 ?> |
PHPの小数点を扱う関数
PHPには、今回紹介するceil関数のような浮動小数点数を扱う関数が他にもあります。次から、それらと比較してceil関数の機能について解説します。
切り下げはfloor関数
先ほど紹介したように、ceilは天井に張る、という意味の英単語をそのまま使った関数です。そして、ceilと逆に、浮動小数点数を引数にして、その数値の切り下げした値を返す関数がfloorです。
なお、floorは、日本語でも床のことをフロアと言うように、床という意味の英単語です。切り上げが天井のceil、切り下げが床のfloorという関数名なので、それぞれの意味を連想すると覚えやすいのではないでしょうか。
floor関数の文法
1 |
floor( 数値 ); |
四捨五入はround
PHPでは、今回紹介するceilや先ほどのfloorの他に、桁を指定して、その桁で四捨五入するround関数も使えます。
なお、ceilとfloorは、小数点の位置で切り上げや切り下げした数値を計算するので、引数は1つでしたが、roundは、数値の他に、桁数の位置を指定できます。そのため、例えば小数点2桁で、四捨五入した数値を計算する、といった使い方が可能です。
round関数の使用例
1 2 3 4 5 |
<?php $pai = 3.14159265359; $out = round($pai, 4); echo $out . "\n"; // 出力結果は3.1416 ?> |
ceil関数の応用例
先ほど説明したようにPHPのceil関数は、小数点の位置で切り上げする、というシンプルな機能です。しかし、実際のプログラムでは、それだけでは処理を作れない、というケースがよくあります。そこで、ceil関数の応用例を紹介します。
特定の桁で切り上げする場合
ceil関数は、小数点で切り上げするので、桁を指定することはできません。しかし、ある桁で切り上げしたいケースはよくあります。その場合よく使われるのは、あらかじめ小数点を変更し、ceil関数で切り上げした後、小数点を基の位置に戻す処理です。
例えば、小数点2桁で切り上げする場合、次のように先に100倍し、ceil関数の結果を100で割ります。
1 2 3 4 5 |
<?php $pai = 3.14159265359; $out = ceil( $pai * 100 ) / 100; echo $out . "\n"; // 結果は3.15 ?> |
逆に100以下を切り上げする場合は、次のように先に100で割り、ceil関数の結果を100倍します。
1 2 3 4 5 |
<?php $in = 12345; $out = ceil( $pai / 100 ) * 100; echo $out . "\n"; // 結果12400 ?> |
マイナスの値を扱う場合
ceil関数の機能は切り上げですが、マイナスの数を扱う場合、より0に近い方に数字に合わせることから、まるで切り下げのように動作します。
ceil関数でマイナスの数を扱う例
1 2 3 4 5 |
<?php $in = -3.14159265359; $out = ceil($in); echo $out . "\n"; // 出力結果は-3.14 ?> |
マイナスの数を絶対値で見た場合に、より大きな数に切り上げしたい場合は、次のようにif文でceil関数とfloor関数を切り替えて使用します。
ceil関数とfloor関数を切り替える例
1 2 3 4 5 6 7 8 9 |
<?php $in = -3.14159265359; if($in < 0) { $out = floor($in); } else { $out = ceil($in); } echo $out . "\n"; // 出力結果は-4 ?> |
ceil関数を使う際の注意点
PHPに限らず、プログラミング言語で浮動小数点数を扱う場合、内部で2進数に変換し、計算しています。そのため、厳密にチェックすると、ごく小さな誤差が発生します。
その数字をそのまま使う場合、その誤差は自動で丸められるので問題ありませんが、ceil関数では、その誤差のせいで予想した数字と合わないケースが発生します。
浮動小数点数の計算の誤差
先ほど説明したように、PHPでも浮動小数点数の計算で、厳密にチェックすると誤差が生じます。次の式は、下記の計算は、そのまま計算するのとceil関数で処理すると結果が変わる例です。
1 2 3 4 5 |
$a = 50 * (10/100 + 1); // 計算結果は55 $b = ceil( 50 * (10/100 + 1) ); // ceil関数の結果は56 $c = ceil( $a ); // この場合もceilの結果は56 |
これは、浮動小数点数を厳密に数値として扱った場合の誤差が原因です。例えば、この例の$aを、100桁の浮動小数点数として表示すると、厳密には55ではなく、プラスの誤差が含まれます。そのため、その極めて小さな誤差をceil関数が扱うことで、計算結果が変わってしまいます。
浮動小数点数の誤差を回避する例
先ほどの式のように計算結果が違う場合、 計算した浮動小数点数を文字列に変換し、それをceil関数の入力のすることで回避可能です。次の例を見てください。
1 2 3 |
$a = 50 * (10/100 + 1); // 計算結果は55 $d = ceil( (string)$a ); // ceil関数の結果は55 |
この例では、$aの数値を、(string)でキャストし、文字列に変換して、ceil関数に渡しています。この方法だと、文字列から2進数の数値に変換して処理するので、正しい結果が得られます。
まとめ
これまで説明したように、ceil関数のceilには「天井を張る」という意味があり、小数点で切り上げを計算する関数です。PHPには、同じような機能の関数として、切り下げのfloor関数や四捨五入のround関数などもあり、ceil関数と同じように使われます。
さらに、今回解説したように、ceil関数自体はシンプルな機能ですが、応用すればいろいろな機能も書けるので、ぜひ、使い方をマスターしてください。