PHP 精度计算引发的灾难性Bug

Posted Qinhir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 精度计算引发的灾难性Bug相关的知识,希望对你有一定的参考价值。

  在维护一个比较老的金融项目时,发现精度的计算简单粗暴,先来看一下代码片段:

if($accountInfo[\'account_money\'] < $repayMoney ){
                rollback();
                return false;
}

  如上代码片段变量所示,上面的代码主要是比较帐户余额及还款数,两者均为双精度浮点数,稍作修改代码,让我们能看到一些输出才更直观

 if($accountInfo[\'account_money\'] < $repayMoney ){
                echo "{$accountInfo[\'account_money\']}\\n\\r";
                echo "{$repayMoney}\\n\\r";
                rollback();
                return false;
}

运行如上代码得到如下图结果

两个数均为1333.35,如果按上面的逻辑来说,不应该进入到 if 体内,但结果却恰恰相反,进行 if 体内并echo 出了两值,通过查阅相关api 发现,php 的精度运算,会在直接+,-,*,/,<,>等运算时丢失精度,因此结果并非如你所愿,在这里提现大家,在PHP中对精度运算,应调用相关API,如BC Math.

以上是关于PHP 精度计算引发的灾难性Bug的主要内容,如果未能解决你的问题,请参考以下文章

php代码审计之弱类型引发的灾难

一个TouchableOpacity引发的灾难

GLSL-片段着色器不同部分的精度不同

MySQL GROUP_CONCAT长度限制引发的一场灾难

mysqldump的disable-keys引发的灾难

为啥代码片段在 matplotlib 2.0.2 上运行良好,但在 matplotlib 2.1.0 上引发错误