PHP浮点比较大于或小于运算符

时间:2012-07-10 14:12:02

标签: php floating-point

我已经读过,由于浮点精度错误的可能性,你不应该直接比较PHP浮点数。

我有一个浮点数,我需要设置一个变量,具体取决于浮点数落入的范围括号。像这样的东西 -

$mytext;

if ($myfloat < 5.5) {
  $mytext = "a";
} else if ($myfloat < 9.7) {
  $mytext = "b";
} else {
  $mytext = "c";
}

使用PHP执行此操作的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

有些人建议不要将浮点数与相等运算符(例如==!=)进行比较,但这个建议是错误的。相等运算符可以正常工作,没有错误。更好的建议更像是这样:浮点算术运算(包括类型之间的转换和从“5.5”等数字转换)通常会引入舍入误差,因此浮点运算的计算结果通常会与数学上精确的结果不同。如果您希望确定使用近似浮点建模的两个精确值是否相等,则应该:

  • 确定建模值中可能存在多少错误。
  • 确定您是否可以容忍由于浮点错误导致报告的数据略有不同,以及您可以容忍的差异(误报)。
  • 确定您是否可以容忍由于浮点错误而导致的报告不相等的相等数量(错误否定)。

至少,您应该估计以上情况。然后确定是否存在可以执行的测试,该测试返回具有可接受的低误报率和误报率的结果。通常,人们使用fabs(a-b) < ErrorThreshold等测试并猜测ErrorThreshold。

猜测不是工程。

以上是为了平等。类似的问题适用于比较订单(例如<<=)。

对于您展示的样本,问题在于您关注的特征是非常靠近5.5和9.7边界的数字。如果稍微高于或略低于边界的数字被放入正确的类别,这是否可以?如果是这样,请使用您拥有的测试。如果不合适,您需要进一步解释您的标准,以及有关$myfloat可能存在多少错误的信息。