我已经读过,由于浮点精度错误的可能性,你不应该直接比较PHP浮点数。
我有一个浮点数,我需要设置一个变量,具体取决于浮点数落入的范围括号。像这样的东西 -
$mytext;
if ($myfloat < 5.5) {
$mytext = "a";
} else if ($myfloat < 9.7) {
$mytext = "b";
} else {
$mytext = "c";
}
使用PHP执行此操作的正确方法是什么?
答案 0 :(得分:0)
有些人建议不要将浮点数与相等运算符(例如==
或!=
)进行比较,但这个建议是错误的。相等运算符可以正常工作,没有错误。更好的建议更像是这样:浮点算术运算(包括类型之间的转换和从“5.5”等数字转换)通常会引入舍入误差,因此浮点运算的计算结果通常会与数学上精确的结果不同。如果您希望确定使用近似浮点建模的两个精确值是否相等,则应该:
至少,您应该估计以上情况。然后确定是否存在可以执行的测试,该测试返回具有可接受的低误报率和误报率的结果。通常,人们使用fabs(a-b) < ErrorThreshold
等测试并猜测ErrorThreshold。
猜测不是工程。
以上是为了平等。类似的问题适用于比较订单(例如<
或<=
)。
对于您展示的样本,问题在于您关注的特征是非常靠近5.5和9.7边界的数字。如果稍微高于或略低于边界的数字被放入正确的类别,这是否可以?如果是这样,请使用您拥有的测试。如果不合适,您需要进一步解释您的标准,以及有关$myfloat
可能存在多少错误的信息。