PHP松散比较

问题描述 投票:0回答:1

为什么这算不为真

php > var_dump('1e123' == '1');
bool(false)

这显然可以,但是我不明白为什么不使用1。

php > var_dump('0e123' == '0');
bool(true)
php
1个回答
0
投票

此数字(带有e)被写为字符串,但实际上,在进行松散比较时,PHP将它们视为浮点数。它们使用scientific notation编写,这仅表示e之后的部分是N x M^E中的指数。 0乘以任何东西即为00 x 10^123仍为0。但是,1 x 10^123是一个非常大的数字,比1大得多。

PHP将第一个字符串转换为double(float),将另一个操作数转换为int。比较浮点数和int会导致比较浮点数。可以这样写:

var_dump(1e123 == 1);
var_dump(0e123 == 0);

如果您尝试使用严格比较进行比较,它将失败,因为严格比较不仅检查值,而且检查类型。比较float与int,即使在数学上具有相同的值,也将导致false。比较两个具有不同文本值的字符串,也会导致错误的结果。

但是,由于PHP中的指数数字是float类型,因此使用如此巨大的数字可能会失去精度。例如

var_dump('1.0000000000000000001e123' == '1e123'); // bool(true)
© www.soinside.com 2019 - 2024. All rights reserved.