0
0

More than 1 year has passed since last update.

PHP:浮動小数点同士の比較には気を付ける。単純にトリプルイコールでは誤判断する

Last updated at Posted at 2023-02-17

浮動小数点同士の比較をトリプルイコールで行うと、誤判断する

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"
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0