首页>新闻动态>尚途学院

关于PHP浮点数转换成整型时的坑

来源:https://www.icvio.com/ 作者:admin 浏览次数:3046次 发布时间:2018-12-19 08:47:05 收藏:添加收藏

吐槽一个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


上面的表格我们还待完善吧,毕竟这种数字不长出现,但是在商品和金融领域,这些数字是常态。下面附上我对这个问题的处理方式,简单粗暴了一些,如果有大侠可以纠正。



function intvals($numbers){
  if(!is_numeric($numbers))return 0;
  return intval(strval($numbers));
}


对,你没看错,就是对这个结果,现将这个数字转换成字符串类型,然后取整返回。