php 精度比较,PHP浮点数精度和比较

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

$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这样的结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值