吐槽一个php开发过程中的坑,心中愤恨啊。$fund = 1232.86;
$intFund = intval($fund*100);
if($intFund == 123286){
return TRUE;
}else{
return FALSE;
}
我相信很多开发者跟我预想的一样,这个肯定会返回TRUE,对吧。
可是事实却不是,这个返回的结果是FALSE。
当1232.86乘以100,这个得到的结果显示出来的是123286,但是却是一个浮点数,如果用这个结果与123286进行比较,他俩是不相等的。如果想将这个结果转换成整形,即用intval处理一下,得到的结果就成了123285了,因为这个浮点数在内存中,是123285.9999999999。厉害吧,你赢了。
当然,更坑的是这个问题并没有我们想想中的那么常出现,这就更坑了,你不知道下一个出现这个问题的数字是多少,因此,我在这里统计一个表格,共大家参考:
浮点数与整数相乘后的结果预期结果
0.58intval(0.58*100)=5758
19.99intval(19.99*100) = 19981999
1232.86intval(1232.86*100) = 123285123286
上面的表格我们还待完善吧,毕竟这种数字不长出现,但是在商品和金融领域,这些数字是常态。下面附上我对这个问题的处理方式,简单粗暴了一些,如果有大侠可以纠正。
functionintvals($numbers){if(!is_numeric($numbers))return0;returnintval(strval($numbers));}
对,你没看错,就是对这个结果,现将这个数字转换成字符串类型,然后取整返回。