3

参考这个链接

我知道字符串类型的操作数转换为数字,然后是通常的数学

但请参阅这些示例代码:

echo intval(1e1);       // 10
var_dump("1e1" == 10);  // true, and it's ok

echo intval(0x1A);      // 26
var_dump("0x1A" == 26); // true, and it's ok

echo intval(042);       // 34
var_dump("042" == 34);  // fasle, Why ?!!!

为什么最后一个代码返回 false。

4

3 回答 3

9

那是因为 PHP 中的字符串到数字的转换是基于一些古老的 C 函数 - strtod. 其规则如下

字符串(的初始部分)的预期形式是可选的前导空格,如 isspace(3) 所识别,可选的加号 ('+') 或减号 ('-'),然后是 (i) 十进制数, 或 (ii) 十六进制数 [...]

十进制数由可能包含基数字符(小数点,取决于语言环境,通常为“.”)的十进制数字的非空序列组成,可选地后跟十进制指数。十进制指数由一个“E”或“e”组成,后跟一个可选的加号或减号,后跟一个非空的十进制数字序列,并表示乘以 10 的幂。[...]

十六进制数由“0x”或“0X”后跟可能包含基数字符的非空十六进制数字序列组成,可选地后跟二进制指数。[...]

如您所见,“1e1”字符串具有非空序列“1”,后跟十进制指数“e1”。因此,它将被转换为十进制数 - 并变为 10。

'0x1A' 字符串遵循十六进制数的规则,将相应地转换为 26。但由于八进制数没有特定规则,“042”将转换为普通十进制 - 并变为 42。当然,不等于 34。

这不应与PHP 本身如何解析数字文字相混淆。以 0 开头的数字文字被视为表示八进制。所以,intval(042)本质上与intval(34)- 但不一样intval("042")

于 2012-09-17T23:00:30.657 回答
3

就这样PHP滚。这是因为当您指定一个字符串并进行转换时,它会转换为一个数字,在您的情况下,第一个1e1表示1 exponent 10x1A是十六进制表示,最后一部分042本身是一个数字,它被转换为42intval(042)表示整数 34 的八进制表示。

于 2012-09-17T22:54:08.390 回答
1

我不知道所有的数学废话,但是,

因为前两个示例很清楚您要做什么..将其转换为指数,然后将其转换为十六进制。但是第三个解决方案不清楚你在做什么,所以它把它转换成 42。换个方式想想。你试图解决一个问题,由于某种原因,“042”不等于 42。你会很困惑

所以使用你需要的东西,如果你需要一个 042 的 int 表示然后转换为一个 int,但如果它是一个字符串,不要指望它以这种方式工作。

于 2012-09-17T22:53:39.093 回答