为了账号安全,请及时绑定邮箱和手机立即绑定

比较php中的浮点数

比较php中的浮点数

PHP
智慧大石 2019-06-18 11:20:36
比较php中的浮点数我想比较一下PHP中的两个浮点,如下面的示例代码所示:$a = 0.17;$b = 1 - 0.83; //0.17if($a == $b ){  echo 'a and b are same';}else {  echo 'a and b are not same';}在此代码中,它返回else条件而不是if条件,即使$a和$b都是一样的。有什么特殊的方法来处理/比较PHP中的浮点数吗?如果是,请帮助我解决这个问题。或者我的服务器配置有问题吗?
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

如果你这样做,他们保持原样。但请注意,浮点值的一个特点是计算看上去要得到相同的值,不需要实际上是相同的。所以如果$a是字面意思.17$b通过计算,它们很可能是不同的,尽管两者都显示相同的值。

通常,对于这样的相等性,您从不比较浮点值,您需要使用最小的可接受的差值:

if (abs(($a-$b)/$b) < 0.00001) {
  echo "same";}

差不多是这样的。


查看完整回答
反对 回复 2019-06-18
?
函数式编程

TA贡献1807条经验 获得超9个赞

读红色警告在手册中第一。你绝不能把浮标比作平等。你应该使用epsilon技术。

例如:

if (abs($a-$b) < PHP_FLOAT_EPSILON) { … }

哪里PHP_FLOAT_EPSILON常量表示一个非常小的数字(您必须在7.2之前的PHP旧版本中定义它)


查看完整回答
反对 回复 2019-06-18
?
万千封印

TA贡献1891条经验 获得超3个赞

或者尝试使用BC数学函数:


<?php

$a = 0.17;

$b = 1 - 0.83; //0.17


echo "$a == $b (core comp oper): ", var_dump($a==$b);

echo "$a == $b (with bc func)  : ", var_dump( bccomp($a, $b, 3)==0 );

结果:


0.17 == 0.17 (core comp oper): bool(false)

0.17 == 0.17 (with bc func)  : bool(true)


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 464 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信