php浮点数判断BUG

最近一个朋友碰到个问题,比较神奇

1
2
3
4
5
6
7
var_dump(is_float(1.1+0.1));
var_dump(is_float(1.2));
if(1.2 <(1.1+0.1)){
	echo "true";
}else{
	echo "false";
}

结果是 true
网上查了一下,原因如下

如果用php的+-*/计算浮点数时,可能会遇到一些计算结果错误的问题,比如echo intval( 0.58*100 );会打印57,而不是58,这个其实是计算机底层二进制无法精确表示浮点数的一个bug,是跨语言的

那么运算浮点数用一些php特有的运算函数
例如 bcadd() 把两个浮点数相加

1
2
3
4
5
if(1.2 <bcadd(1.1,0.1,10)){
	echo "true";
}else{
	echo "false";
}

发表评论