精度的问题并不是PHP本身的问题,只要有浮点数打算的可能都会存在精度的问题,在这里我们不穷究详细的产生缘故原由,想理解详细的需求产生问题可以查看浮点数的表示。
首先我们来看一个大略的例子:
$a = 0.1;$b = 0.7;var_dump(($a+$b) == 0.8);
打印输出的结果是:boolean false,很奇怪吧,正常我们以为这该当便是相等的,该当输出为:boolean true 才对。这是由于不可能精确地用有限位数表达某些十进制分数。例如:十进制的 1/3 变成了 0.3333333...

那么我怎么来办理这个精度打算的问题呢?PHP4版本以上为我们准备一下函数:
bcadd — 2个任意精度数字的加法打算bccomp — 比较两个任意精度的数字bcdiv — 2个任意精度的数字除法打算bcmod — 对一个任意精度数字取模bcmul — 2个任意精度数字乘法打算cpow — 任意精度数字的乘方bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulusbcscale — 设置所有bc数学函数的默认小数点保留位数bcsqrt — 任意精度数字的二次方根bcsub — 2个任意精度数字的减法
我们来看看bcadd的利用:
bcadd ( string $left_operand , string $right_operand , int $scale = ? ) : string// $left_operand $right_operand 都为相加的两个数,$scale 为小数点后的小数位数
我们利用bcadd来改造一下前面的代码来看看运行结果:
$a = 0.1;$b = 0.7;var_dump(bcadd($a,$b,2) == 0.8);
这次打印输出便是:boolean true
接着再看看我们常常在比拟账户余额充足的时候可以利用的方法:bccomp
bccomp ( string $left_operand , string $right_operand , int $scale = int ) : int
如果两个数相等返回0,左边的数left_operand比较右边的数right_operand大返回1,否则返回-1。
echo bccomp(2, 3); // -1echo bccomp(1.0002, 1, 3); // 0echo bccomp(3.24553533, 3, 5); // 1