ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – 比较运算符

2019-07-14 21:31:29  阅读:220  来源: 互联网

标签:php operators if-statement comparison


Reffer this link.

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

但请参阅以下示例代码:

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.

解决方法:

这是因为PHP中的字符串到数字转换是基于一些古老的C函数 – strtod.它的规则是follows

The expected form of the (initial portion of the) string is optional
leading white space as recognized by isspace(3), an optional plus
(‘+’) or minus sign (‘-‘) and then either (i) a decimal number, or
(ii) a hexadecimal number […]

A decimal number consists of a nonempty sequence of decimal digits
possibly containing a radix character (decimal point,
locale-dependent, usually ‘.’), optionally followed by a decimal
exponent. A decimal exponent consists of an ‘E’ or ‘e’, followed by
an optional plus or minus sign, followed by a nonempty sequence of
decimal digits, and indicates multiplication by a power of 10. [… ]

A hexadecimal number consists of a “0x” or “0X” followed by a nonempty
sequence of hexadecimal digits possibly containing a radix character,
optionally followed by a binary exponent. […]

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

‘0x1A’字符串遵循十六进制数的规则,并将相应地转换为26.但由于没有十八进制数的具体规则,’042’将被转换为纯十进制 – 并且变为42.当然,这不等于34.

这不应该与PHP本身如何解析数字文字相混淆.以0开头的数字文字被认为代表十八进制.因此,intval(042)与intval(34)基本相同 – 但与intval(“042”)不同.

标签:php,operators,if-statement,comparison
来源: https://codeday.me/bug/20190714/1461234.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有