可能重复:
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'没有伤害.
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)
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将这些字符串作为浮点数进行比较,它们都是零,所以你必须使用===运算符,
其他答案已经指出了这一点,但 PHP 手册现在已经明确说明了这一点。PHP 将任何以数字为界的字符串视为E科学记数法
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
正如您所看到的,这是不区分大小写的(E或e)。这成为一个陷阱是在弱类型字符串比较中
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
| 归档时间: |
|
| 查看次数: |
5425 次 |
| 最近记录: |