如果用php的+-*/计算浮点数的时候,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*100 );会打印57,而不是58
这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的
可以用精度函数库解决问题
bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减
比较两个高精度数字
var_dump(bccomp($left=4.45, $right=5.54, 2));
// -1
两个高精度数相加
var_dump(bcadd($left=1.0321456, $right=0.0243456, 2));
//1.04
两个高精度数相减
var_dump(bcsub($left=1.0321456, $right=3.0123456, 2));
//-1.98
两个高精度数相除
var_dump(bcdiv($left=6, $right=5, 2));
//1.20
两个高精度数相乘
var_dump(bcmul($left=3.1415926, $right=2.4569874566, 2));
//7.71
设置bc函数的小数点位数
bcscale(3);
var_dump(bcdiv(‘105’, ‘6.55957’));
// 16.007