为何字符串"8000423E-1670872784"与"8000427E-1689194367"==比较返回true?
关于PHP字符串比较的疑问解答
先看测试代码:
php > var_dump("8000423E-1670872784" == "8000427E-1689194367"); bool(true) php > var_dump("8000423E-1670872784" === "8000427E-1689194367"); bool(false) php > var_dump("8000423A-1670872784" == "8000427A-1689194367"); bool(false)
第一个比较返回true的原因
PHP的==是松散类型比较,当检测到两个字符串符合科学计数法的数字格式时,会自动将它们转换成浮点数再对比。
这两个字符串的指数部分都是极小的负数(-1670872784、-1689194367),远超浮点数能精确表示的范围,转换后都会下溢为0,所以0和0比较结果为true。
而===是严格比较,会同时校验值和类型,这两个字符串本身内容不同,因此返回false。
第一个比较和第三个比较的区别
第三个比较里的字符串包含字母A,不符合科学计数法的格式(科学计数法的指数标识只能是E或e),PHP不会将它们转换成数字,而是直接做字符串的松散对比——两个字符串内容明显不同,所以返回false。
内容的提问来源于stack exchange,提问作者aswine
相关产品推荐
相关产品推荐

