ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:小数点以下の切り捨て誤差の対処

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

f:id:AJYA:20171218125623j:plain
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でも計算誤差に気がついたのは初めてです。
誤差が積み重なると、大きな値の違いになるので、気をつけて結果を確認しなければなりません。