浮動小数点数について
TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > 浮動小数点数について
コンピューターの小数の扱い方
PHPに限定した話ではなく、広い範囲での話しだけど、面倒なのでPHPに絞って考えてみる。
あれ!?
<?php var_dump(floor(0.1 + 0.7) * 10); ?>
出力結果は、8になると思われるが、浮動小数点として扱っているので、7になってしまう。
なぜこうなるのか
たとえば、10進数で0.1を2進数で表示させると、0.000110011…という循環小数になってしまう。他の値でも、循環小数になることが多い。
つまり、10進数の小数を2進数の小数を扱おうとしても、正確な値を出せない。
それではどうするのか
ある程度の誤差を許容してやる。PHPのマニュアルには以下のようにある。
浮動小数点数値が等しいかどうかを調べるには、比較時の丸め誤差の上界を用います。
<?php $a = 1.23456789; $b = 1.23456780; $epsilon = 0.00001; if(abs($a-$b) < $epsilon) { echo "true"; }
もっと正確に使いたければ、gmpとかを使うんだろうか。小数を使わないように単位を調整するとかでもいいと思う。