PHP表示两个不同的字符串是相同的

And*_*ndy 103 php string

可能重复:
php == vs === operator
等式(== double equals)和identity(=== triple equals)比较运算符有何不同?

为什么以下语句会返回true

"608E-4234" == "272E-3063"
Run Code Online (Sandbox Code Playgroud)

我也试过用字符串周围的单引号.我可以false通过使用===运算符而不是使用运算符来获得它的唯一方法==

我的猜测是PHP将它视为某种方程,但它似乎有点奇怪.

任何人都可以详细说明吗?

xda*_*azz 108

"608E-4234"浮点数格式,因此它们在比较时会转换为数字.

608E-4234而且272E-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)
Run Code Online (Sandbox Code Playgroud)

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

例如,typeof运算符总是返回一个字符串,因此您可以使用

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

  • 另见:http://phpsadness.com/sad/47 (26认同)
  • `Numerical Strings` - > [What.](http://tvtropes.org/pmwiki/pmwiki.php/Main/FlatWhat)它是不是更难以在PHP中编写安全的应用程序. (5认同)
  • 关于[运营商比较]的手册中的重要内容(http://php.net/manual/en/language.operators.comparison.php):*如果您将数字与字符串**进行比较,或者比较涉及数字字符串**,然后将每个字符串转换为数字,并以数字方式执行比较.* (4认同)

Jvd*_*erg 20

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       
Run Code Online (Sandbox Code Playgroud)

  • @stoj是的,但我的观点是这个答案没有回答这个问题:它描述了PHP使用的fp表示,但它没有说明一个重要的事实:"如果你的字符串看起来像FP值,它将被转换为FP值". (7认同)
  • 但他没有比较花车,他正在比较弦乐.所以PHP用于浮动**应该是无关紧要的 (2认同)
  • @jalf php是松散类型并且正在转换幕后的值==如果你不熟悉语言则是邪恶的,如果他想将它们作为他需要使用的字符串比较===或strcmp,正如其他人所提到的那样. (2认同)

Mat*_*hai 13

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

608 x 10^-4234 == 272 x 10^-3063 
Run Code Online (Sandbox Code Playgroud)

PHP将此解释为存在0 = 0.


Mat*_*ari 10

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

  • 正如我在我的回答中所说,那是因为两个字符串被比较为浮点数,它们被舍入为零,因此它们**相等**但不相同** (2认同)

Alf*_*asa 5

我想回答.如果您使用的是"===",则还要检查类型而不是值.如果您使用"==",则只需检查值是否相同.

你可以参考这里这里.


Mac*_*ity 5

其他答案已经指出了这一点,但 PHP 手册现在已经明确说明了这一点。PHP 将任何以数字为界的字符串视为E科学记数法

EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})

正如您所看到的,这是不区分大小写的(Ee)。这成为一个陷阱是在弱类型字符串比较中

var_dump("2E1" == "020"); // true
Run Code Online (Sandbox Code Playgroud)

2E1是真的2 * (10 ^ 1),结果是 20。在那里插入任何其他字母,它将返回预期的false。从问题来看

"608E-4234" == "272E-3063"
Run Code Online (Sandbox Code Playgroud)

结果是

608 * (10 ^ -4234) == 272 * (10 ^ -3063)
Run Code Online (Sandbox Code Playgroud)

这两个数字都不能用 PHP 表示(正如JvdBerg 指出的那样),因此它们被转换为0