看手册时上面说,由于计算机内容对浮点型处理方式的原因,会造成数据精度的定时,因此永远不要比较两个浮点数是否相等。这怎么可能呢,怎么可能不会遇到比较浮点数字的问题呢?于是自己测试了下:
echo 1.2565895895 == 1.2565895895;
心想不是说精度会丢失么,就故意写个小数位多的数来比较,发现输出的结果是:1。这精度没丢失啊,怎么?手册写错了?不可能,于是再试一个:
if((0.1+0.7) == 0.8){
echo "相等";
}else{
echo "不相等";
}
我*,结果竟然输出的是"不相等",精度真的丢失了。什么情况?原来只是在运算的结果是float类型时比较会产生这种现象。那该怎么比较两个float的大小呢,手册给出了一个函数:
int bccomp ( string $left_operand , string $right_operand [, int $scale = int ] )
left_operand
左边的运算数, 是一个字符串.
right_operand
右边的运算数, 是一个字符串.
scale
可选的scale参数被用作设置指示数字, 用来指定比较多少位小数.
返回值
如果两个数相等返回0, 左边的数left_operand比较右边的数right_operand大返回1, 否则返回-1.
用这个函数来处理:
if(bccomp((0.1+0.7),0.8)==0){
echo "相等";
}else{
echo "不相等";
}
这个时候输出的就是"相等"了。
那么再来试一个:
echo bccomp(1.2566895895,1.2565895895);
注意,这两个数是不相等的,但结果输出的是 0,也就是相等。这怎么又出问题了呢,这个时候就用到了第三个参数,指定下比较到指定位数的小数,比如,这两个小数只有第小数点后第4位不同,那就设置为4或者5来试试:
ho bccomp(1.2566895895,1.2565895895,5);
这个时候输出的就是 1了,也就是左边的比右边的大。
小小的float,坑还真不少啊!