我读到过,由于浮点精度可能存在错误,因此不应该直接比较PHP浮点数字。
我有一个浮点数字,我需要根据浮点数字的范围设置一个变量。类似这样的东西-
$mytext;
if ($myfloat < 5.5) {
$mytext = "a";
} else if ($myfloat < 9.7) {
$mytext = "b";
} else {
$mytext = "c";
}
用PHP做这件事的正确方法是什么?
有些人建议不要将浮点数与等式运算符(如==
或!=
)进行比较,但这种建议被误导了。相等运算符可以正常工作,不会出错。更好的建议是这样的:浮点算术运算(包括类型之间的转换和从数字(如"5.5")的转换)通常会引入舍入误差,因此浮点运算的计算结果通常与数学上精确的结果不同。如果您想确定用近似浮点建模的两个精确值是否相等,您应该:
- 确定建模值中可能存在的误差
- 确定您是否可以容忍由于浮点错误而报告的略微不同的确切数量相等,以及您可以容忍的差异量(假阳性)
- 确定您是否可以容忍由于浮点错误(假阴性)而报告的不相等的精确量
至少,你应该估计一下上面的情况。然后确定是否可以进行测试,以返回可接受的低假阳性率和假阴性率的结果。通常,人们使用诸如fabs(a-b) < ErrorThreshold
之类的测试并猜测ErrorThreshold。
猜测不是工程。
以上是为了平等。类似的关注点适用于顺序比较(例如<
或<=
)。
对于你展示的样本,问题是你有多关心表征非常接近5.5和9.7边界的数字。如果将略高于或略低于边界的数字归入正确的类别,可以吗?如果是这样,请使用现有的测试。如果不可以,您需要进一步解释您的标准,以及关于$myfloat
中可能存在多大错误的信息。