てきとうなさいと べぇたばん

浮動小数点数について

コンピューターの小数の扱い方

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とかを使うんだろうか。小数を使わないように単位を調整するとかでもいいと思う。

参考にしたサイト