【PHP】BC Mathを指数表記に対応させる

指数表記によるBC Mathのエラー

【PHP】BC Mathで小数点の計算を正確に行う

PHPで任意制度の小数点計算を行うBC Math関数では、数値の桁数が非常に多くなる場合に用いられる指数表記(数値の中でe, Eなどで表される)に対応しておらず、関数の引数としてその値が用いられた場合にエラーとなってしまいます。

エラーの例

$rate = 8.33333333333E-5;
$result = (string)bcmul((string)$loan_price, (string)$rate, 16);
Fatal error: bcmul(): Argument #2 ($num2) is not well-formed filename:(filename)

このエラーに対応するために指数表記の値を任意の桁数で打ち切って通常の小数点形式の値に変換します。

指数表記を小数点形式に変換

以下のように関数の処理で指数表記の値を小数点形式に変換します。
spritfで小数点の桁数を指定します。

function indexNumToDecimalPoint(mixed $number)
{
    if (!preg_match('/^[0-9]+(\.[0-9]+)?$/', $number))
    {
        return sprintf("%.32f", $number);
    }
        
    return $number;
}

$rate = indexNumToDecimalPoint(8.33333333333E-5);
var_dump($rate);
exit;

出力結果(変換結果)

string(34) "0.00008333333333330000488627098409"

Follow me!