0
<?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

4

3 回答 3

4

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

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

这就是依赖精确值的系统(如金融应用程序)不使用浮点数的原因。他们使用特殊用途的高精度类型,或者用两个单独的整数值表示美元和美分。

于 2012-10-25T03:52:42.513 回答
1

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

于 2012-10-25T03:51:10.420 回答
0

为什么浮点数不准确:

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

并非所有数字都可以用这个完美地表示,所以它只是给你它的“最佳尝试”。

于 2012-10-25T04:04:46.800 回答