1、浮点数坑
PHP在使用加减乘除等运算符计算浮点数的时候,经常会出现意想不到的结果,特别是关于财务数据方面的计算,会造成Bug。这是所有语言基本上都会遇到的问题,所以基本上大部分语言都提供了精准计算的类库或函数库。
$a = 1000; $b = 999.99; var_dump($a-$b); //float(0.0099999999999909)
你认为/期望的输出是float(0.01),实际是float(0.0099999999999909)。
2、解决方法一
1位小数*10,2位小数*100,3位小数*1000,……n位小数*n,做完加减乘除法后,再除以倍数。(著名ERP系统SAP也是使用类似的方法处理的)
$a = 1000; $b = 999.99; var_dump(($a*100-$b*100)/100); //float(0.01)
3、解决方法二
使用PHP提供的高精度函数计算。
$a = 1000; $b = 999.99; var_dump(bcsub($a,$b,2)); //string(4)"0.01"
高精度函数库:
bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减
目前有 0 条评论