BCMath扩展提供了一套bc(Binary Calculator)数学函数,它是一个高精度运算的函数库,可以准确地对任意精度的数字进行运算。
PHP的Windows版本已内建对此扩展的支持,Linux版本则需要手动 安装BCMath。
1 2 3 4 5 6 7 8 9 10 11 | bcadd($left_operand,$right_operand[,$scale]):两个任意精度数字的加法计算,计算实际结果不满足精度时会补0。 bcsub($left_operand,$right_operand[,$scale]):两个任意精度数字的减法计算,计算实际结果不满足精度时会补0。 bcmul($left_operand,$right_operand[,$scale]):两个任意精度数字的乘法计算,计算实际结果不满足精度时会返回 按实际精度返回。 bcdiv($left_operand,$right_operand[,$scale]):两个任意精度数字的除法计算,计算实际结果不满足精度时会补0。如果 除数($right_operand)按指定精度($scale)取值为0,则返回null,并产生一个警告。 bccomp($left_operand,$right_operand[,$scale]):比较两个任意精度的数字。如果相等返回0, 如果$left_operand>$right_operand返回1,否则返回-1。 bcscale($scale): 设置所有bc数学函数的默认小数点保留位数。设置成功返回true,否则返回false。 在以上函数中除bcscale()外所有的精度都是可选参数,当不显示指定精度,且并未调用bcscale()方法时, 精度的默认值为php安装目录下php.ini文件中bcmath.scale配置的值,默认为0。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php $a=1.2345; $b=6.7; echo bcadd($a,$b); echo bcadd($a,$b,2); echo bcadd($a,$b,5); echo bcsub($a,$b); echo bcsub($a,$b,2); echo bcsub($a,$b,5); echo bcmul($a,$b); echo bcmul($a,$b,2); echo bcmul($a,$b,5); $a=5; $b=2; echo bcdiv($a,$b); echo bcdiv($a,$b,2); echo bcdiv($a,$b,5); $a=1.2345123 $b=1.2345456 echo bccomp($a,$b); echo bccomp($a,$b,4); echo bccomp($a,$b,5); ?> |
换句话说:我们看到十进制小数,在计算机内存储的不是一个精确的数字,也不可能精确。所以在数字加减乘除后出现意想不到的结果。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。
以上……