我知道我不应该使用==
或!=
来比较浮点数,但我应该使用其他比较运算符(如<
或<=
(来比较它们吗?
对于浮点,您可以使用PHP的bcmath
扩展:
对于任意精度的数学,PHP提供二进制计算器,它支持任何大小的数字,精度高达2147483647(或0x7FFFFFFF(小数,如果有足够的内存,以字符串表示。
特别是,bccomp()
采用两个参数。如果它们相等,则返回0,如果第一个参数较大,则返回1,如果第二个参数较大则返回-1。第三个参数指示您要查找的精度的小数位数。
bcmath('12.555437830', '12.555437829', 10);
// returns 1
注意,这个函数的一个缺点是参数被视为字符串,尽管PHP的松散类型通常使得这不是一个问题。
比较浮点数是否相等经常有问题的原因是浮点运算只接近实数。因此,如果我们有两个用浮点运算计算的数字x
和y
,那么评估x == y
通常不会告诉我们用精确数学计算的两个数字x和y是否相等。换句话说,询问x == y
是否确实不能给我们想要的答案(除非我们为此仔细设计和分析了代码(。
关系运算符(如<
(也存在同样的问题。如果我们有x
和y
,它们中的一个或两个与理想计算的x或y相差一些小的量,那么x < y
可能是真的,而x<y为false,反之亦然。
这个问题没有普遍的解决办法。在某些应用程序中,错误可能是可以容忍的。在一些应用中,可以导出浮点误差e的界,这样我们就可以证明,例如,如果x < y-e
为真,那么x<y为真。(但是,如果x < y-e
为假,则我们不确定x<y。(因此,适当的解决方案取决于具体的应用。