Floating point PHP计算有缺陷

Floating point PHP计算有缺陷,floating-point,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 i

我正在写一个小脚本来计算扣除后的税额。 我的应用程序有几个提供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%(不是真的,但为了便于论证,因为我的实际计算有点复杂),无论哪种方式,这似乎是我能得到的最简单的计算

因此,100%(收入)-20%(公司税)+5%(费用报销)应该给我留下总数的85%。如第一个回波信号所示


然而,如果报表出现错误,会说“会计错误”。这里发生了什么?

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


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

请参阅比较浮点的手册:

您可能需要研究PHP的扩展。我通过搜索此网站并查找问题找到了参考。

这是IEEE754浮点数的常见问题。基本上你在那里永远不会有平等。。。要了解我的意思,请添加一个
echo($total-$tax)+$expenses)行以查看什么到达那里…@ppeterka我已经有回声了,它打印0。85@Husman哎呀,我忽略了那条线。。。如果将条件重写为
(($total-$tax)+$expenses)-0.85)<0.000001
,会怎么样?(此外,@akirk建议的是一种广泛使用的解决方案)