【问题标题】:Strange Results for String comparison in PHPPHP中字符串比较的奇怪结果
【发布时间】: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


【解决方案1】:

我尝试运行您的代码,但在最初的几次尝试中我得到了notnot。只有在将php版本降低到5.4.3或以下后,我才得到matchnot

您似乎在运行过时的 php 版本,遇到了this bug。从php5.4.4开始就解决了。

最好的办法可能是升级你的 php 版本(尽管严格比较不是坏事)

编辑:根据原始答案中的 cmets,看起来问题在以后的版本中也存在,但仅限于 32 位系统。

问题本身来自于 php 在比较方面非常松散,在比较之前将看起来像数字的字符串转换为数字。例如,这导致 php 将“1e3”视为等于“1000”。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2011-09-18
  • 2021-09-07
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多