PHP圆形疯狂的bug

时间:2012-10-25 03:46:45

标签: php floating-point

<?php
    $last_percent = 0;
    $as = array("110.800002098083",  "30", "36.1499996185303", "11", "13", "13.9899997711182", "74.5200042724609", "13.9899997711182");
    $t = 304.46000552177;
    foreach($as as $a) {
        $last_percent += round($a*100/$t, 2);
    }
    var_dump( $last_percent);
    $last_percent = 100 - $last_percent;
    var_dump( $last_percent);
?>

为什么结果是0.33000000000001?为什么它只发生在100和99?如果我使用$ last_percent = 90 - $ last_percent; 结果是-9.67

3 个答案:

答案 0 :(得分:4)

简短的回答是浮动值并不完美。有时,根据您的系统设置,有错误。

更长的答案是浮点值不是数值的精确表示,它们是近似值 - 在大多数情况下 - 足够好。问题是,有时候你想要的值会落入float不能完美运行的区域,你会得到这样的舍入错误。

这就是为什么依赖于精确值的系统(如财务应用程序)不使用浮点数。它们使用特殊用途的高精度类型,或者用两个单独的整数值表示美元和美分。

答案 1 :(得分:1)

当您需要100%精度时,浮点计算不可靠。 PHP文档在这里有http://php.net/manual/en/language.types.float.php的正式警告,如果你需要高精度的计算,你应该使用任意精度数学函数或gmp函数。

答案 2 :(得分:0)

为什么浮点数不准确:

他们将小数视为二进制分数的复合。 1/2 + 1/4 + 1/8 + 1/16 + ......

并非所有数字都能完美地表现出来,所以它只是给你“最佳尝试”。