浮動小数点

プログラムをしているとはまる浮動小数点の計算。

PHPで書くとこうなる。

<?php
    $n = (0.1 + 0.7);
    printf("%fn", $n);

    $n = $n * 10;
    printf("%fn", $n);
    
    printf("%fn", floor($n));
?>

出力は順に

0.800000
8.000000
7.000000

floorは切り捨てなので、正しくは8にならなければならないところ、
7になってしまいます。

小数点を正しく計算するには、任意精度数学関数か、gmp関数を使用する必要があります。

<?php
    $n = bcadd(0.1, 0.7, 4);
    $n = bcmul($n, 10, 4);
    printf("%fn", floor($n));
?>

出力は、8.000000 になります。

ちなみに

<?php
    $n = (1 + 7) / 10;
    $n = $n * 10;
    printf("%fn", floor($n));
?>

としても出力は8になります。

The following two tabs change content below.

taira

Sofrware Engineer.

Comments are closed.