PHPでシステム開発を行っていると、消費税や割合算出の為、小数点が絡む計算があると思いますが、あれってみなさんどうしてますか?
僕は以前、以下のように何も考えずに計算してました。
echo number_format((3 / 10) * 100);
例えばこんな感じですが、今回はPHPで小数点が絡む計算には「BC Math」を使った方がいい、といった点をご紹介いたします。
もしもアフィリエイトは会員登録後も無料です!
今すぐ会員登録してアフィリエイトを始めよう!
なぜPHPでの小数点が絡む計算で「BC Math」がよいのか?
ではどうして「BC Math」がいいのかという点ですが、ネットで「php 小数点計算」とかで検索すると色々出てくると思います。
例えばですが、
var_dump( floor( ( 0.1 + 0.7 ) * 10 ) );
このようなコードがあった場合、普通は「8」が返ってくると思いますが、実は「7」が返ってきちゃいます。
浮動小数点の精度でも説明がありますが、phpの内部的な値が「7.9999999999999991118...」のような値になっており、floorで切り捨てると「7」になるといった感じですね。(php側で値を丸める際にどうしても誤差が生まれてしまうみたいですね。)
これは厄介です。
phpに限らず他の言語でも小数点が絡む計算は何かと面倒ですが、ではどうするのか?ここで使うのが「BC Math」ですね。
「BC Math」の使い方
「BC Math」は別途インストールが必要ですが、使い方としては以下のような感じです。
BC Mathを使った足し算
// 0.1 + 0.7
bcadd(0.1, 0.7, [小数点の桁数]);
小数第1位までが必要な場合は、第3引数を1にします。
BC Mathを使った引き算
// 0.5 - 0.1
bcsub(0.5, 0.1, [小数点の桁数]);
小数第1位までが必要な場合は、第3引数を1にします。
BC Mathを使った掛け算
// 0.2 * 0.3
bcmul(0.2, 0.3, [小数点の桁数]);
小数第1位までが必要な場合は、第3引数を1にします。
BC Mathを使った割り算
// 0.7 / 0.1
bcdiv(0.7, 0.1, [小数点の桁数]);
小数第1位までが必要な場合は、第3引数を1にします。
では、これらを踏まえて冒頭の計算を行う場合は以下のような感じです。
var_dump( floor( ( 0.1 + 0.7 ) * 10 ) );
↓
var_dump( floor( bcmul( bcadd( 0.1, 0.7, 1 ), 10, 1) ) );
「7」ではなく「8」が返ってくると思います。
まとめ
いかがだったでしょうか。
こういった事はできるだけシステム開発時に気づきたい問題ですよね。実際に運用が始まってからでは、後の祭りです…。
今日はこのあたりでサクッと終了です。