【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
参考
BCMathのインストール
ちなみに、別の環境でBCMathをインストールしたが、下記の記事が分かりやすかった。