php 中的字符串比较奇怪行为
String comparation strange behavior in php
今天我在比较 2 个不同的字符串时发现了非常奇怪的行为
dd('115e-401' == '115e-402');
这是 return true
。但是为什么?;
已快速测试 PHP 中的以下 returns true
:
var_dump('115e-401' == '115e-402');
然后确认这个returns false
(注意e
到f
的变化):
var_dump('115f-401' == '115f-402');
我只能推测编译器将字符串视为大指数并且比较太大而无法正确计算(115e-401
和 115e-402
是可笑的小数字)。注意:感谢@Tobias K 指出这些是 large 而不是 small 数字的错误!
如果您想正确比较字符串,请改用严格的类型比较(即 ===
或 strcmp
):
var_dump('115e-401' === '115e-402'); // false
var_dump(strcmp("115e-401","115e-402")); // A non-zero value
strcmp
将 return 一个非零值 - 表示它们不相等。在这种情况下,结果为 0 表示相等。
注意:澄清了 strcmp
的结果将是非零的,表示值不相等,这是来自@u_mulder.
的有用反馈
当字符串看起来是数字时,打字就开始了。
如果两个操作数都是数字字符串,或者一个操作数是一个数字,另一个是数字字符串,那么比较是按数字进行的。
E-401 是一个非常小的数字,小于 PHP 可以表示的数字。最小的数字是 PHP_FLOAT_MIN
大约 2.2E-308(取决于系统)。
因此,您的字符串被转换为数字。它们小于 PHP 可以表示的值并被转换为零。 0 == 0 为真。
今天我在比较 2 个不同的字符串时发现了非常奇怪的行为
dd('115e-401' == '115e-402');
这是 return true
。但是为什么?;
已快速测试 PHP 中的以下 returns true
:
var_dump('115e-401' == '115e-402');
然后确认这个returns false
(注意e
到f
的变化):
var_dump('115f-401' == '115f-402');
我只能推测编译器将字符串视为大指数并且比较太大而无法正确计算(115e-401
和 115e-402
是可笑的小数字)。注意:感谢@Tobias K 指出这些是 large 而不是 small 数字的错误!
如果您想正确比较字符串,请改用严格的类型比较(即 ===
或 strcmp
):
var_dump('115e-401' === '115e-402'); // false
var_dump(strcmp("115e-401","115e-402")); // A non-zero value
strcmp
将 return 一个非零值 - 表示它们不相等。在这种情况下,结果为 0 表示相等。
注意:澄清了 strcmp
的结果将是非零的,表示值不相等,这是来自@u_mulder.
当字符串看起来是数字时,打字就开始了。
如果两个操作数都是数字字符串,或者一个操作数是一个数字,另一个是数字字符串,那么比较是按数字进行的。
E-401 是一个非常小的数字,小于 PHP 可以表示的数字。最小的数字是 PHP_FLOAT_MIN
大约 2.2E-308(取决于系统)。
因此,您的字符串被转换为数字。它们小于 PHP 可以表示的值并被转换为零。 0 == 0 为真。