浮点型数字对比问题
首先,看一个实例:
$a = 99.96+101.577-99.96;
$b = 101.577;
if( $a >= $b ){
echo 'yes';
}else{
echo 'no';
}
按一般常理推测,$a是等于$b的,但计算机并不这样认为,这是浮点型数字的对比,可能$a是等于101.5769999999……这样一个数,近似等于101.577 结果然后很意外的输出了 “no”,建议不要将浮点型数字进行对比!!!
尤其是在存储价格重量的问题上,进行的对比的话,简直就是个巨坑~
解决办法:
1 存储不要用小数,可以用整型来存储,不过要确定精度,比如两位的精度,12.99 就存储1299,存储的时候乘以100,取出的时候除以100,就不会有对比不准确的烦恼了;
2 可以用近似相等的办法,判断相等,在这里,又有两个小办法,但原理都是一样的:
(1)绝对值小于一定精度,abs($a-$b)<pow(0.1,5),如果小于这个精度,其实也是可以默认基本上是相等的了
(2)函数bccomp($a, $b, 5),可以去官网看看这个函数,我觉得和上面的是差不多原理的。