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

PHPで浮動小数点数の計算を正確に行う

数値の計算プログラムの処理では小数点が絡む場合に正確な値が求められないことがありますが、これは浮動小数点数の扱いが実行環境(プラットフォーム)の影響を受けているためです。

(例)

$result = 0.7 + 0.1;
var_dump($result);

出力結果

float(0.7999999999999999)

出力結果の期待値としては0.8ですが、実際には 0.799…が出力されてしまいます。

PHPでは任意精度で数値演算を行えるようになる、BC Mathという拡張機能を使用することで小数点の計算誤差に対処できます。

BC Mathの有効化

BC Mathは拡張機能のため、あらかじめ環境にインストール及び有効化されている必要があります。

(例)Docker環境の場合

(Dockerfile)

FROM php:8.0.21-apache
RUN docker-php-ext-install bcmath

BC Mathの有効化はphpinfoより確認することができます。
(BCMath support enabledでOK)

BC Mathによる演算

BC Math関数を使用した具体的な演算方法の一部を演算の種類ごとに示します。
(BC Mathを使用しない場合の出力結果と比較)

関数仕様の詳細は公式ドキュメントを参照ください。
https://www.php.net/manual/ja/ref.bc.php

加算する (+)

加算の場合はbcaddを使用します。

$result1 = 0.7 + 0.1;
$result2 = bcadd('0.7', '0.1', 3);

var_dump($result1, $result2);

出力結果

float(0.7999999999999999)
string(5) "0.800"

第三引数には小数点以下の有効桁数を指定します。
(bcscaleでも同様に指定可)

減算する(-)

減算の場合はbcsubを使用します。

$result1 = 0.7 - 0.1;
$result2 = bcsub('0.7', '0.1', 3);

var_dump($result1, $result2);

出力結果

float(0.6) 
string(5) "0.600"

乗算する(×)

乗算の場合はbcmulを使用します。

$result1 = 0.7 * 0.1;
$result2 = bcmul('0.7', '0.1', 3);

var_dump($result1, $result2);

出力結果

float(0.06999999999999999) 
string(5) "0.070"

除算する(÷)

除算の場合はbcdivを使用します。

$result1 = 0.7 / 0.1;
$result2 = bcdiv('0.7', '0.1', 3);

var_dump($result1, $result2);

出力結果

float(6.999999999999999) 
string(5) "7.000"

冪乗する(^)

冪乗する場合はbcpowを使用します。
「0.7の3乗」

$result1 = 0.7 ** 3;
$result2 = bcpow('0.7', 3, 5);

var_dump($result1, $result2);

出力結果

float(0.3429999999999999) 
string(7) "0.34300"

Follow me!

【PHP】BC Mathで小数点の計算を正確に行う” に対して1件のコメントがあります。

コメントは受け付けていません。