关于PHP浮点数转换成整型时的坑
吐槽一个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.58 | intval(0.58*100)=57 | 58 |
19.99 | intval(19.99*100) = 1998 | 1999 |
1232.86 | intval(1232.86*100) = 123285 | 123286 |
上面的表格我们还待完善吧,毕竟这种数字不长出现,但是在商品和金融领域,这些数字是常态。下面附上我对这个问题的处理方式,简单粗暴了一些,如果有大侠可以纠正。
function intvals($numbers){
if(!is_numeric($numbers))return 0;
return intval(strval($numbers));
}
对,你没看错,就是对这个结果,现将这个数字转换成字符串类型,然后取整返回。
- 上一条: Linux服务器搭建Apache与Nginx的优缺点
- 下一条: 没有了