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

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

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になります。
PHP: floor - Manual

f:id:AJYA:20171218125623j:plain
photo credit: eloyruizmontañez Very Scientific Stuff 2 3000x2250 via photopin (license)

文字列に変換してから切り捨てる

PHPのマニュアルにも、浮動小数点数の精度について記述があります。
PHP: 浮動小数点数 - Manual

マニュアルには、任意精度数学関数のBC Math 関数が紹介されています。
PHP: BC Math 関数 - Manual

BC Math 関数を使えばいいのでしょうが、今回はstrval()関数で文字列に変換してから、切り捨てることにしました。
PHP: strval - Manual

具体的には

$a = 36.3 * 700;
$a = floor(strval($a));

としました。
こうすることで、期待したとおりの値になりました。


JavaScriptに続いてPHPでも計算誤差に気がついたのは初めてです。
誤差が積み重なると、大きな値の違いになるので、気をつけて結果を確認しなければなりません。