2012-10-25 151 views
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.67PHP疯狂bug

+2

浮动。点。数学。 – rdlowrey

+2

[每个计算机科学家应该知道的关于浮点算术](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – sachleen

+1

http://php.net/manual/ en/language.types.float.php < - 有一个带有警告的大红色框。阅读。 – hakre

回答

1

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

+5

*“使用浮点数字时,PHP是不可实现的。”* ... PHP **不是**不可靠的,*浮点数学*是不精确的。 – rdlowrey

+1

对不起,真的,这不是PHP,它的浮点问题 –

+1

@ElenaSharovar - 再怎么样[编辑答案】(http://stackoverflow.com/posts/13061289/edit)这么说? – ghoti

4

简单的答案是浮点值不完美。有时,根据您的系统设置,有错误。

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

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

0

为什么浮点数是不准确的:

他们把小数位二进制小数的化合物。 1/2 + 1/4 + 1/8 + 1/16 + ...

并非所有的数字都可以完美表示,所以它只是给你它是'最好的尝试'。