为什么这算不为真
php > var_dump('1e123' == '1');
bool(false)
这显然可以,但是我不明白为什么不使用1。
php > var_dump('0e123' == '0');
bool(true)
此数字(带有e
)被写为字符串,但实际上,在进行松散比较时,PHP将它们视为浮点数。它们使用scientific notation编写,这仅表示e
之后的部分是N x M^E
中的指数。 0
乘以任何东西即为0
。 0 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)