【问题标题】:Why are strings "0e368798" and "00000000" equal, per PHP's equality operator?根据 PHP 的相等运算符,为什么字符串“0e368798”和“00000000”相等?
【发布时间】:2013-12-25 15:51:32
【问题描述】:

有人能解释一下为什么以下两条语句返回 true 吗?

if ('0e368798' == '00000000')

if ((string)'0e368798' == (string)'00000000')

为什么我必须使用严格运算符来检查这两个字符串的相等性?

【问题讨论】:

  • 你不需要类型转换,只需使用 ===

标签: php equality


【解决方案1】:

因为XeYX * 10^(Y),而0 乘以任何东西都是00000000 也是 0。而PHP中的==很直观的认为,如果可以转换成数字,应该可以。

编辑:它是在一个有用的评论中,现在已被删除,所以向我没有注意到名字的评论者道歉,我会在这里重复一遍 - 来自PHP docs on comparison

如果您将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较。这些规则也适用于 switch 语句。当比较是 === 或 !== 时,类型转换不会发生,因为这涉及比较类型和值。

【讨论】:

  • 另外,我认为1e368798 低于 IEEE doubles 的范围,因此也为零。等等,不,那是1e-368798
  • @JanDvorak: 1e368898 落在 它之上,因此它的计算结果为 Inf
  • 谢谢。我知道数字的 XeY 格式以及在非严格比较期间发生的软类型转换。但是,我很困惑为什么对它们进行类型转换也不起作用。但你清除了。
猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多