PHP8.0で、2つのfloat型数値を使った除算(割り算)をする関数が追加されました。fdiv()。
PHP7ですでに追加されているintdiv()の小数点版です。結果も浮動小数点で返されます。
でも使い道が思いつかない。'/' の式で十分だし。
fdiv() はパラメータで指定した2つのfloat型で除算(割り算)を行います。
fdiv(float $num1, float $num2): float
num1: 分子の値
num2: 分母の値
$num1 = 1;
$num2 = 4;
$val = fdiv($num1, $num2);
var_dump($val);
float(0.25)
割り算なので分母に0は指定できません。エラーにはなりませんが、返される値が INF, -INF, NaN のいずれかになります。
(NaN は非数値の意味で数値としては無効値。INF, -INF はInfinity(無限大)のこと。)
PHP公式ドキュメント
// 分子が正数で分母が0ならINFを返す
$num1 = 1;
$num2 = 0;
$val = fdiv($num1, $num2);
var_dump($val);
// 分子が負数で分母が0なら-INFを返す
$num1 = -1;
$num2 = 0;
$val = fdiv($num1, $num2);
var_dump($val);
// 分子が0で分母が0ならNaNを返す
$num1 = 0;
$num2 = 0;
$val = fdiv($num1, $num2);
var_dump($val);
float(INF)
float(-INF)
float(NAN)
なんでこんな結果になるかといえば、fdiv() は浮動小数点の表現形式で広く一般的に使われている、 IEEE 754 に準拠して計算しているから。
'/' ではいけないの?
『割り算を関数を使ってやる必要ある?』と思う人がほとんどでしょう。プログラミングでは '/' を使えばかんたんに割り算の式ができるから。
'/' でダメということはありません。ただし、分母が0になる可能性は押さえときましょう。
除算の式で分母が0になったらエラー例外が発生します。
<?php
$num1 = 1;
$num2 = 0;
$val = $num1 / $num2;
var_dump($val);
PHP Fatal error: Uncaught DivisionByZeroError: Division by zero in /home/vagrant/php-test.php:5
Stack trace:
#0 {main}
thrown in /home/vagrant/php-test.php on line 5
Devisionは除算(割り算)のこと。除算の分母で0を使われたら困るという内容。
'/' でもうひとつ気をつけることは、IEEE 754 に準拠しているか分からないこと。
一般的な業務計算レベルでは問題ないですが、計算の精度が必要になってくるとちょっと不安です。
fdiv() の追加は intdiv() の存在が関係している?
そういうことも考えて fdiv() を追加したんじゃないかな?
ただ、そんな高度な精度が必要ならC++やJava, Pythonを使うし、ゴリゴリの科学技術計算ならFortranとかを使います。
PHPで必要だろうか? 個人的には '/' で事足りると思う。
ちなみに、PHP7で intdiv() という、整数同士の除算を行う関数が追加されたんですが、結果もint型で整数であるために小数点以下は切り捨てられます。
$num1 = 1;
$num2 = 4;
$val = intdiv($num1, $num2);
var_dump($val);
$num1 = 10;
$num2 = 4;
$val = intdiv($num1, $num2);
var_dump($val);
int(0)
int(2)
fdiv() を追加した一番の理由はこれなんじゃないだろうか?
『そんな中途半端な intdiv() なんてものを追加するくらいなら、小数点以下に対応した関数を用意せーっ!』という声が出るだろうことはかんたんに想像できるし。