云服务器

PHP之比较运算符

2017-06-22 11:57:06 0

大家用PHP做网页,写脚本,甚至写服务器软件(例如swoole),用起来总是得心应手,但总是容易在一些小细节上掉进坑里,本文就带领大家一起过过PHP的比较运算符的坑。

PHP比较运算符之模糊比较

PHP的比较运算符是有着明确的比较运算规则的,咱们首先说说模糊比较(==, >, <, >=, <=) PHP的模糊比较遵循如下的规则,记住是按顺序的哦 | 运算数 1 类型 | 运算数 2 类型 | 结果 | | ------------- | ------------- | ---- | | null 或 string | string | 将 NULL 转换为 "",进行数字或词汇比较 | | bool 或 null | 任何其它类型 | 转换为 bool,FALSE < TRUE | | object | object |内置类可以定义自己的比较,不同类不能比较,相同类和数组同样方式比较属性(PHP 4 中),PHP 5 有其自己的说明 | | string,resource 或 number | string,resource 或 number | 将字符串和资源转换成数字,按普通数学比较 | | array | array | 具有较少成员的数组较小,如果运算数 1 中的键不存在于运算数 2 中则数组无法比较,否则挨个值比较(见下例)| | object | 任何其它类型 | object 总是更大 | | array | 任何其它类型 | array 总是更大 | 有了这个表,当PHP的比较出现非预期的结果的时候,大家心中就有数啦。 总体来说,PHP总是倾向与将比较的双方都转换为数字,然后再进行比较,除非第一个比较的值为bool

PHP比较之浮点数比较

上一小节提到PHP总是倾向于与将比较的双方转换为数字进行比较,那么数字比较中的一个大坑,浮点数的比较会如何呢?
 浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。

关于大家在写PHP的时候,偶尔会遇到的一些莫名其妙的比较错误的问题,基本都是落在上面两个说明的坑里面,发出来大家一起加强记忆和理解,祝大家使用PHP愉快。

 

上一篇: 无

微信关注

获取更多技术咨询