早速ですが、皆さんPHPで小数取り扱う場合どうされてますか?

そんなもんは、「つかわねぇ。」 それ正解です。

許されるならば使わないのが一番です。
ですが政府は、またまた増税をご希望のようで。。。
消費税計算やら何やらで使わなくてはいけない機会も増えるでしょう。




ってことで本題へ。
PHPで小数取り扱ってみます。

■お題
( 0.1 + 0.7 ) × 10 を floor関数で処理
※floor:端数の切捨て

まずは、何も考えずに頭の中でやってみましょうかね。

「8」っすね。
まあなんら問題なく即答でクリアですね。
では、PHPにこれをやってもらいましょう。

●PHP
var_dump( floor( ( 0.1 + 0.7 ) * 10 ) );

はい。
「8」っすね。

えっ!?
float(7)
「7」っすか?

詳細は以下を見てください。
参考URL:浮動小数点の精度

簡単に言うと、
内部的な値が 「7.9999999999999991118・・・・・・・」となって
これの端数を切り捨てているので「7」となるようです。

じゃあ、どうするか?
「任意精度数学関数(BC Math関数)」なるものを使用します。
詳しくはコチラ
※BC Math関数を使用する場合、別途インストールが必要ですのでご注意を!

$add = bcadd( 0.1, 0.7, 1 ); //小数第1位までが必要なため第3引数に「1」をセット
$mul = bcmul( $add, 10 );
$ret = floor( $mul );
var_dump( $ret );

float(8)
となりましたね。

ということで、
今日の格言。
「見えざるものを見よ!」

挨拶が遅れました。

システム開発課に在籍しております、ティーン・カネオカと申します。

今後はシステムに関連する話も、随時ご紹介していきます。

この記事を書いた人

ティーン・カネオカ
ティーン・カネオカ
システム開発担当。
無類の円安好き、1円上がったり下がったりで一喜一憂する今日この頃。
厄年の影響を半端なくうけていて、外出するのが怖い・・・