PHPの浮動小数点演算についてfloor(3)を取って結果2を得る奇妙な問題

1434 ワード

$amount = 300;
$num = 1.2;
$num = $num - 1.1;

$num = floatval($num);
var_dump($num);

$amount = ($num * $amount) / 10;

var_dump($amount);

var_dump(floor($amount));exit;

結果:
float 0.1
float 3
float 2

結果は想像以上、PHPの浮動小数点演算は、このような穴です....
2時間後、解決策を見つけました.以下のようにします.
$amount = 3000;
$num = 1.2;
$num -= 1;

// $amount = $num * $amount / 10;
$amount = bcmul($num, $amount) / 10;

echo $amount . "
"; echo floor($amount); exit;

bcmulについては、ここを参照してください.
http://php.freehostingguru.com/function.php-bcmul.php
この問題については、ここを参考にしてください.
http://stackoverflow.com/questions/812815/php-intval-and-floor-return-value-that-is-too-low
私が感嘆したいのは、海外で問題に対する議論が非常に深いことだ.
また、この問題について、我々は普段PHPを使って計算するのはあまりにも厳密ではありません.もし正確な計算をして、意外な結果が出たくない計算をするならば、BC関数ライブラリを使って、以下のようにします.
http://php.freehostingguru.com/group.php-5.php
    BC      ,     PHP       --enable-bcmath    。

bcadd:	           。
bccomp:	          。
bcdiv:	           。
bcmod:	           。
bcmul:	           。
bcpow:	           。
bcscale:	        BC            。
bcsqrt:	            。
bcsub:	           。