使用“ <=”或“> =”比较浮点数是否理想?

时间:2018-11-27 02:05:35

标签: php floating-point operators

我知道我不应该使用==!=来比较浮点数,而是应该使用其他比较运算符,例如<<=来比较它们?

2 个答案:

答案 0 :(得分:1)

对于浮点数,您可以使用PHP的bcmath扩展名:

  

对于任意精度数学,PHP提供了二进制计算器,该二进制计算器支持任意大小和精度的小数,最多2147483647(或0x7FFFFFFF)个小数,如果有足够的内存(表示为字符串)。

尤其是bccomp()带有两个参数。如果它们相等,则返回0;如果第一个参数较大,则返回1;如果第二个参数较大,则返回-1。第三个参数指示您要查找的精度的小数位数。

bcmath('12.555437830', '12.555437829', 10);
// returns 1

请注意,此函数的一个缺点是参数被当作字符串使用,尽管PHP的松散键入通常使其成为非问题。

答案 1 :(得分:0)

比较浮点数是否相等通常是有问题的,原因是浮点算术仅近似于实数算术。因此,如果我们有两个用浮点算术计算出的数字xy,则求值x == y通常不会告诉我们两个数字 x < / em>和 y 的精确数学计算结果相等。换句话说,询问x == y是否没有给我们确定的答案(除非我们为此目的精心设计和分析了代码)。

诸如<之类的关系运算符也存在相同的问题。如果我们有xy,其中之一或两者都与理想计算的 x y 相差很小,则{{ 1}}可能为true,而 x < y 为false,反之亦然。

此问题没有一般解决方案。在某些应用中,该错误可能是可以容忍的。在某些应用中,可能会得出浮点误差 e 的界限,这样我们可以证明,如果x < y为真,则 x < / em> < y 是正确的。 (但是,如果x < y-e为假,则不确定 x < y 。)因此,适当的解决方案取决于特定的应用。