我知道我不应该使用==
或!=
来比较浮点数,而是应该使用其他比较运算符,例如<
或<=
来比较它们?
答案 0 :(得分:1)
对于浮点数,您可以使用PHP的bcmath
扩展名:
对于任意精度数学,PHP提供了二进制计算器,该二进制计算器支持任意大小和精度的小数,最多2147483647(或0x7FFFFFFF)个小数,如果有足够的内存(表示为字符串)。
尤其是bccomp()
带有两个参数。如果它们相等,则返回0;如果第一个参数较大,则返回1;如果第二个参数较大,则返回-1。第三个参数指示您要查找的精度的小数位数。
bcmath('12.555437830', '12.555437829', 10);
// returns 1
请注意,此函数的一个缺点是参数被当作字符串使用,尽管PHP的松散键入通常使其成为非问题。
答案 1 :(得分:0)
比较浮点数是否相等通常是有问题的,原因是浮点算术仅近似于实数算术。因此,如果我们有两个用浮点算术计算出的数字x
和y
,则求值x == y
通常不会告诉我们两个数字 x < / em>和 y 的精确数学计算结果相等。换句话说,询问x == y
是否没有给我们确定的答案(除非我们为此目的精心设计和分析了代码)。
诸如<
之类的关系运算符也存在相同的问题。如果我们有x
和y
,其中之一或两者都与理想计算的 x 或 y 相差很小,则{{ 1}}可能为true,而 x < y 为false,反之亦然。
此问题没有一般解决方案。在某些应用中,该错误可能是可以容忍的。在某些应用中,可能会得出浮点误差 e 的界限,这样我们可以证明,如果x < y
为真,则 x < / em> < y 是正确的。 (但是,如果x < y-e
为假,则不确定 x < y 。)因此,适当的解决方案取决于特定的应用。>