JavaScriptの計算誤差への対処を書きました。
ajya.hatenablog.jp
このとき、同時にPHPの小数点以下の切り捨て誤差の対処もしました。
JavaScriptとは異なる箇所で誤差発生
JavaScriptでは、36.3×700=25,410になるはずのところ、25,409になっていました。
PHPでは、同じ値の計算でも36.3×700=25,410になっていました。
この値を小数点以下の切り捨てのためにfloor()関数で値を求めると、25,410が25,409になります。
http://php.net/manual/ja/function.floor.php
photo credit: eloyruizmontañez Very Scientific Stuff 2 3000x2250 via photopin (license)
文字列に変換してから切り捨てる
PHPのマニュアルにも、浮動小数点数の精度について記述があります。
http://jp2.php.net/manual/ja/language.types.float.php
マニュアルには、任意精度数学関数のBC Math 関数が紹介されています。
http://jp2.php.net/manual/ja/ref.bc.php
BC Math 関数を使えばいいのでしょうが、今回はstrval()関数で文字列に変換してから、切り捨てることにしました。
http://jp2.php.net/manual/ja/function.strval.php
具体的には
$a = 36.3 * 700; $a = floor(strval($a));
としました。
こうすることで、期待したとおりの値になりました。
JavaScriptに続いてPHPでも計算誤差に気がついたのは初めてです。
誤差が積み重なると、大きな値の違いになるので、気をつけて結果を確認しなければなりません。