浮動小数点同士の比較をトリプルイコールで行うと、誤判断する
if ((0.2 + 0.3) === 0.5) echo '同じ数値';
else echo '異なる数値';
// どの小数点でも誤判定するわけではないが、この場合はelseが表示されてしまう。
正確性を求めるなら BC Math関数が良いが、消費税ならば工夫でできそう
消費税
1.1に100をかけて計算し、最後に100で割れば良いかも。
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)
公式ドキュメント
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"
減算
減算の場合は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"