【发布时间】:2019-10-26 04:23:48
【问题描述】:
我们今天遇到了一个问题,我很惊讶我以前没有遇到过。和字符串比较有关:
echo ("9400110897799014514025" == "9400110897799014514018" ? "match" : "not");
echo ("94001108" == "94001107" ? "match" : "not");
两套都不匹配,但第一套错误地报告“匹配”,而第二套正确地声明它“不”匹配。我们通过使用 '===' 代替 '==' 解决了这个问题,但我真的很想了解这里发生了什么。
添加:它是 PHP 5.3
【问题讨论】:
-
PHP 会自动将看起来像数字的字符串转换为浮点数并进行比较。如果数字对于您的系统来说太大,您可以获得相等。使用 === 或 strcmp 可避免隐式强制转换为浮点数。
-
您的脚本返回
notnot。我错过了什么吗? sandbox.onlinephpfunctions.com/code/… -
@waterloomatt 它在我的 64 位系统上返回 notnot,但在我的 32 位系统上返回 matchnot。
-
@kainaw:你的 32 位系统运行哪个 php 版本?
-
@Stratadox 通常为 7。我在 32 位和 64 位系统上的此测试中降至 5.3,以验证它是由隐式强制转换为浮点数导致的错误。 32 位系统在处理大数字时会失去准确性,并认为它们是相等的。
标签: php string string-comparison php-5.3