コードロード

エラー討伐

【PHP】BCMath関数を使わないで正確に小数点同士を計算する

結論

X倍して整数にしてから、結果をXで割る。

事象

PHPで小数点以下を含む値の引き算だと、二進数表現の精度が落ちる影響で、期待した値にならないことがある。

<?php
echo(floor((0.1 + 0.7) * 10));
// 結果:7

8になるはずなのに、 floor() で小数点以下を切り捨てると、なぜか7になる。

これは 0.1 + 0.7 の結果が、精度の誤差で0.799999999999999933386618522491…となるかららしい。

対策

BCMathをインストールして、 bcsub() を使うと正しく計算できる、といろんな記事に書いてある。

でも、別途BCMathをインストールしてApachを再起動して〜てやると、少々面倒なのと影響範囲が大きかったので怖くて辞めた。PHPのバージョンも古かったので。

なので下記で対応。X倍して整数にしてから、結果をXで割る。

<?php
$a = (0.1 * 10) + (0.7 * 10);
echo($a / 10);
// 結果: 8

参考

rockstock2008.blog17.fc2.com

BCMathのインストール

ちなみに、別の環境でBCMathをインストールしたが、下記の記事が分かりやすかった。

saka24.blue