【问题标题】:PHP expresses two different strings to be the same [duplicate]PHP将两个不同的字符串表示为相同的[重复]
【发布时间】:2026-01-18 05:05:01
【问题描述】:

可能重复:
php == vs === operator
How do the equality (== double equals) and identity (=== triple equals) comparison operators differ?

为什么下面的语句会返回true

"608E-4234" == "272E-3063"

我也尝试过在字符串周围加上单引号。我可以让它评估为false 的唯一方法是使用=== 运算符而不是==

我的猜测是 PHP 将其视为某种等式,但它似乎有点奇怪。

谁能详细说明?

【问题讨论】:

  • 回声 608E-4234 = 0;回声 272E-3063 = 0; 0==0
  • php.net/strcmp 说什么?
  • PHP is weakly/loosely typed。根据上下文,您声称的是字符串,实际上是其他内容。所以如果你想比较字符串,最好使用===。了解您的运营商。
  • 其实这个问题并没有完全重复,不只是weakly/loosely typed的问题,而是PHP的==的行为在与==比较时会将数字字符串转换为数字,即使它们都是字符串。这种行为与 javascript 不同,后者也有 =====

标签: php string


【解决方案1】:

"608E-4234"float number format,所以比较时会转换成数字。

608E-4234272E-3063 都将是 float(0),因为它们太小了。

对于 php 中的==

如果您将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为数字,然后 以数字方式进行比较。

http://php.net/manual/en/language.operators.comparison.php

注意:

同时具有===== 的javascript 中的行为呢?

答案是行为与 PHP 不同。在 javascript 中,如果你比较两个相同类型的值,===== 相同,所以在比较两个相同类型的值时不会发生类型转换。

在 javascript 中:

608E-4234 == 272E-3063 // true
608E-4234 == "272E-3063" // true
"608E-4234" == 272E-3063 // true
"608E-4234" == "272E-3063" // false (Note: this is different form PHP)

所以在javascript中,当你知道结果的类型时,你可以使用==而不是===来保存一个字符。

例如,typeof 运算符总是返回一个字符串,所以你可以使用

typeof foo == 'string' 而不是typeof foo === 'string' 没有伤害。

【讨论】:

  • 手册中关于 operator comparations 的重要说明:如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字和以数字方式执行的比较。
  • Numerical Strings -> What. 用 PHP 编写安全应用程序是不是更难了。
  • @phresnel 不是。使用===,应该在 PHP 101 中教授“准确比较这些值”。它只会让那些来自没有模糊比较的语言的人感到困惑,比如 C 和 Java。
  • @lzkata:这是肯定的,但我没想到当我比较两个字符串文字时,可能会发生这样的事情。换句话说:我没想到当我比较两个完全相同类型的操作数时,需要=== 运算符。当然文档中提到了它,但是文档也是fuzzyquite fuzzy
【解决方案2】:

我正在尝试回答。 如果您使用“===”,则还要检查类型而不是值。 如果您使用“==”,您只需检查该值是否相同。

您可以参考herehere

【讨论】:

    【解决方案3】:

    PHP 将这些字符串作为浮点数进行比较,它们都为零,因此您必须使用=== 运算符,

    【讨论】:

    • 正如我在回答中所说,这是因为这两个字符串被比较为浮点数,四舍五入为零,因此它们是 equal 但不是 相同
    【解决方案4】:

    PHP 使用 IEEE 754 进行浮点数,并且您的数字非常小,以至于它们的值为 0。

    见:http://en.wikipedia.org/wiki/IEEE_floating_point

    Name        Common name         Base    Digits  E min   E max   
    binary32    Single precision        2   23+1    −126    +127        
    binary64    Double precision        2   52+1    −1022   +1023       
    

    【讨论】:

    • 但他不是在比较浮点数,而是在比较字符串。所以 PHP 对浮点数的使用 应该 是无关紧要的
    • @jalf php 是松散类型的,并且正在转换幕后的值 == 如果您不熟悉语言,如果他想将它们作为字符串进行比较,他需要使用 === 或strcmp 正如其他人提到的那样。
    • @stoj 是的,但我的意思是这个答案没有回答这个问题:它描述了 PHP 使用的 fp 表示,但它没有说明“如果你的字符串看起来像FP值,会转换成FP值”。
    【解决方案5】:

    我认为 PHP 将其解读为科学语法,将其翻译为:

    608 x 10^-4234 == 272 x 10^-3063 
    

    PHP 将其解释为 0 = 0

    【讨论】:

      【解决方案6】:

      这是它所看到的:
      http://www.wolframalpha.com/input/?i=608E-4234&dataset=
      http://www.wolframalpha.com/input/?i=272E-3063

      由于它们不适合变量,它们都等于 0,或者 php 选择的任何默认值,因此是等价的。

      【讨论】:

        最近更新 更多