PHP计算存在缺陷

时间:2013-03-13 12:04:34

标签: floating-point

我正在编写一个小脚本来计算扣除后的税额。 我的应用程序有几个提供CRUD功能的PHP脚本。 我可以添加每月费用,总计费收入,然后计算公司税的欠款。

所有数据都存储在数据库中,但是在进行计算时我遇到了一个有趣的问题,我将简化下面的代码,以便可以重现:

$total = 1.0;
$tax = 0.2;
$expenses = 0.05;

echo (($total-$tax) + $expenses); // this echo's 0.85
// (1.0 - 0.2) + 0.05 

if( (($total-$tax) + $expenses) == 0.85 ) {
    echo "totals add up";
}
else {
    echo "accounting error";
}

这个想法是所有总数都按百分比计算。 1.0是收入的100%,有关月份的费用是5%(不是真的,但为了争论,因为我的实际计算有点复杂),无论哪种方式,这似乎是最简单的我可以把我的计算结果归结为。

所以100%(收益) - 20%(公司税)+ 5%(费用索赔)应该留给我85%的总额。如第一个echo声明所示。

然而,if语句会跳起并说“会计错误”。这里发生了什么?

3 个答案:

答案 0 :(得分:4)

这是浮点计算的常见问题。简而言之,一些十进制数不能用二进制来描述。

常见的解决方案是坚持使用整数并以美分计算所有内容,并且仅在输出除以100时计算。

答案 1 :(得分:1)

看一下比较浮点的手册: http://php.net/manual/en/language.types.float.php

答案 2 :(得分:1)

您可能想要调查PHP的BCMath扩展名。我通过搜索此网站并找到问题here找到了参考。