在维护一个比较老的金融项目时,发现精度的计算简单粗暴,先来看一下代码片段:
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进行金融项目开发时遇到的精度计算问题。具体表现为两个理论上相等的浮点数(1333.35)在比较时出现了意外的结果。文章进一步介绍了PHP中浮点数运算的潜在风险,并推荐使用BCMath等专门的API来确保高精度计算。
830

被折叠的 条评论
为什么被折叠?



