2014年3月4日火曜日

PHPで小数計算が必要になったら・・・

ご無沙汰しております。
コピペプログラマのkanedaです。

さてさて早速ですが、皆さん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)
となりましたね。

ということで、
今日の格言。

「見えざるものを見よ!」










0 件のコメント:

コメントを投稿