floating-point - PHP计算有缺陷

标签 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%( yield )- 20%(公司税)+ 5%(费用报销)应该让我得到总额的 85%。如第一个 echo 语句所示。

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

最佳答案

这是浮点计算的常见问题。简而言之,某些十进制数无法用二进制准确描述。

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

关于floating-point - PHP计算有缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15384830/

相关文章:

c - 使用最接近的浮点运算

c - 在类型转换繁重的程序中省略小数点

c++ - 如果小数位数大于 0,如何使用 printf 只打印小数?

c++ - 浮点除法与浮点乘法

javascript - 如何使用dojo.number.round实现整数的toFixed功能?

javascript - 如何解释 float 组索引?

floating-point - IEEE float 舍入

python - Sigmoid 越界

c - 将 char 数组的值放入 float 变量中

python - python中的极端浮点精度数1.0-(0.1^200)