欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP浮点数精度和比较

程序员文章站 2022-03-30 17:03:03
...

平时对于浮点数运用并不是很多,偶然的一次对浮点数进行了比较,却出现了意外的结果,所以便翻查各种资料寻求原因,大致弄明白了这个问题,我们先来看一个比较

$a = 1 - 9/10;
$b = 0.1;
if($a == $b){
    echo “相等”;
}else{
    echo "不相等";
}

打眼一看,这$a是0.1,$b也是0.1,那不就是相等吗,但是如果你把代码运行一遍你会发现,输出的是不相等,很多疑问便跑出来了,为什么?
如果你熟读手册的话,你会发现,浮点数章节中有大大的一个Warning,讨论的就是浮点数精度的问题,如果还想要了解更多,也可以看看浮点数指南。下方还列举出来了如何比较两个浮点数,当然除了手册中提供的比较方法外,我们还可以借助BCMath,这是PHP提供的专门进行任意精度计算的函数。

当然这种情况并非PHP独有,其他语言也存在,例如Java,这种所谓的bug是跨语言的。如果你使用Java,你会发现,变量a输出的是0.09999999999999998,这样一来,很直观的就知道了,变量a和变量b并不相等,但是在PHP中,不管你用echo还是var_dump(),输出的都是0.1,明明都是0.1,为什么还不相等,这便会令人更加的迷惑和不解。PHP难道没有函数可以输出类似Java的结果吗?其实是有的,只是这个函数并不是经常用到,它就是var_export。

var_export($a);

当然想要输出上述效果,PHP版本必须在5.4.22之后,在这个版本之前,仍然会输出0.1。在php.ini中有参数serialize_precision用来设置输出的精度,默认为17。如果PHP版本满足要求的话,我们再来调用这个函数,便会得到0.099999999999999978这样的结果。