欧阳简之 > PHP中关于浮点型计算注意事项

热爱代码,对每一行代码保持一颗敬畏之心。

一般我们用户金额设计上可能会保留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);
tagged by php