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: 。