104

可能重复:
php == vs === 运算符
相等(== 双等号)和身份(=== 三等号)比较运算符有何不同?

为什么以下语句返回true

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

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

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

有人可以详细说明吗?

4

6 回答 6

109

"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)

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

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

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

于 2012-09-26T09:22:38.803 回答
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       
于 2012-09-26T09:24:28.027 回答
13

我认为 PHP 将其视为一种科学语法,将其翻译为:

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

PHP 将其解释为0 = 0.

于 2012-09-26T09:24:49.217 回答
10

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

于 2012-09-26T09:23:29.873 回答
5

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

你可以参考这里这里

于 2012-09-26T09:23:03.923 回答
3

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

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

于 2012-09-26T09:25:47.337 回答