一般我们用户金额设计上可能会保留2位小数点,那再涉及一些金额加减操作的时候,如果不精确到两位小数点计算,就有可能导致误差。
举个简单的例子:
$money = 0.1;
$price = 0.7;
var_dump(($money + $price) == 0.8);
结果输出的是:bool(false)
具体解释可以参考官方说明:浮点数的精度
所以,我们在涉及高精度计算的时候,应该使用任意精度数学函数
bcadd — 2个任意精度数字的加法计算
bccomp — 比较两个任意精度的数字
bcdiv — 2个任意精度的数字除法计算
bcmod — 对一个任意精度数字取模
bcmul — 2个任意精度数字乘法计算
bcpow — 任意精度数字的乘方
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 设置所有bc数学函数的默认小数点保留位数
bcsqrt — 任意精度数字的二次方根
bcsub — 2个任意精度数字的减法
还是上面的例子,我们使用bcadd处理加法,返回bool(true)
,得到了我们想要的结果
$money = 0.1;
$price = 0.7;
var_dump(bcadd($money, $price, 2) == 0.8);