欢迎您访问我的笔记本站旨在于记录一些平时工作中遇到的一些问题和解决方法,方便查阅,部分内容来源于网络,如有侵权请联系我删除
  • 微信微信
您现在的位置是:首页 > PHP后端

PHP浮点数计算精度问题-[原创]

日期:2018-09-25 09:51:37 作者:tanyi 来源:我的笔记 浏览:1269 次
浮点数计算结果的精度问题在实际工作中非常重要,尤其是跟财务相关的数据,如果结果有误差后就很麻烦

PHP 为任意精度数学计算提供了二进制计算器(Binary Calculator),它支持任意大小和精度的数字,以字符串形式描述。

下面我们看一个例子

image.png

90.09是客户提现前的余额,90是提现金额,后面那一长串是php程序计算的结果,很明显这个结果不是我们所预期的,之所以出现这种情况是因为程序是直接将余额和提现金额直接相减导致,假如用户余额为$money_before,提现金额为$money,那么这时的计算方式就是$money_before-$money,所以得到上面那一长串数字,网上了解到php对浮点直接计算是有精度损失的,所以我们要用到上面php给我们专门提供的一个精度计算的方法,手册里面介绍是BC 数学 函数,它一共包含如下函数方法:

  1. bcadd — 2个任意精度数字的加法计算

  2. bccomp — 比较两个任意精度的数字

  3. bcdiv — 2个任意精度的数字除法计算

  4. bcmod — 对一个任意精度数字取模

  5. bcmul — 2个任意精度数字乘法计算

  6. bcpow — 任意精度数字的乘方

  7. bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus

  8. bcscale — 设置所有bc数学函数的默认小数点保留位数

  9. bcsqrt — 任意精度数字的二次方根

  10. bcsub — 2个任意精度数字的减法

此时我们需要的是计算两个浮点数相减并得到正确的结果,那么bcsub这个函数就是我们需要的

bcsub($money_before,$money,2);//第三个参数是需要精确到小数几位

image.png

现在再来看看数据,0.09,这个就是我们需要的正确结果

提交评论
评论列表