18.PHP数字与字符串比较的误区
2016-12-03 14:50
295 查看
2016.12.03
1.问题描述
今天在做微信关键词自动回复时,需要判断输入的是否为整数,使用了
if(intVal($key) == $key),
即将输入转化为整数再与自身比较,若相等则为整数,但是发现无论输入什么结果都是相等
2.解决过程
打印从微信过来的输入变量类型发现为string型,所以猜想是将整形和字符串作比较时出错。
查询相关资料发现,在PHP中,当数字与字符串作比较时,系统会先将字符串转化为数字,再与数字进行比较。
所以以上判断条件等价于if(intVal($ket) == intVal($key)),自然一直是相等的。
将一个无法转换为数字的字符串转化为数字,结果总是为0 ,所以将其与0总是返回true。
3.延伸拓展
PHP中比较运算符的规则
1).当两个字符进行比较时,比较这两个字符的ASCII码
2).当两个字符串进行比较时,从第一个字符开始挨个比较对应的ASCII码,知道某一位置两个字符ASCII码不一致时给出结果,如'ba'>'az','10'<'a'
3).当一个数字与一个字符/字符串比较时,首先将字符/字符串转化为数字,再与数字进行比较,如12<'21as', 'dsa'=0,同理 'a'+10=10;
4).当两个数字字符串进行比较时,首先将两个字符串当做数字,并且用科学计数法存储这两个字符串,科学计数法保留小数点后16位,再进行比较。
由此就会产生一个bug
如:$str1 = "123456789012345678";
$str2 = "123456789012345679";
(最后一位不一样)
在比较时会先将两个字符串用科学计数法进行储存,因为保留16位小数,所以结果为
$str1=1.2345678901234567E+17;
$str2=1.2345678901234567E+17。
结果再比较就会产生$str1 等于 $str2 这样的结果;
解决办法为使用 === 或者strcmp等字符串比较函数进行强类型判断
另外,长度不同、在字符串中加非数字字符等等都会引起两个字符串的不等。
例如:$str1 = "a123456789012345678";
$str2 = "a123456789012345679";
此时$str1 和 $str2就不相等,因为存在a 这个非数字字符,所以系统不会讲两个字符串当成数字字符串进行比较,而是使用 2)中两个字符串比较方法。
参考链接:http://www.cnblogs.com/lwbqqyumidi/archive/2013/01/31/2887086.html
http://blog.sina.com.cn/s/blog_62e96b110100x18w.html
1.问题描述
今天在做微信关键词自动回复时,需要判断输入的是否为整数,使用了
if(intVal($key) == $key),
即将输入转化为整数再与自身比较,若相等则为整数,但是发现无论输入什么结果都是相等
2.解决过程
打印从微信过来的输入变量类型发现为string型,所以猜想是将整形和字符串作比较时出错。
查询相关资料发现,在PHP中,当数字与字符串作比较时,系统会先将字符串转化为数字,再与数字进行比较。
所以以上判断条件等价于if(intVal($ket) == intVal($key)),自然一直是相等的。
将一个无法转换为数字的字符串转化为数字,结果总是为0 ,所以将其与0总是返回true。
3.延伸拓展
PHP中比较运算符的规则
1).当两个字符进行比较时,比较这两个字符的ASCII码
2).当两个字符串进行比较时,从第一个字符开始挨个比较对应的ASCII码,知道某一位置两个字符ASCII码不一致时给出结果,如'ba'>'az','10'<'a'
3).当一个数字与一个字符/字符串比较时,首先将字符/字符串转化为数字,再与数字进行比较,如12<'21as', 'dsa'=0,同理 'a'+10=10;
4).当两个数字字符串进行比较时,首先将两个字符串当做数字,并且用科学计数法存储这两个字符串,科学计数法保留小数点后16位,再进行比较。
由此就会产生一个bug
如:$str1 = "123456789012345678";
$str2 = "123456789012345679";
(最后一位不一样)
在比较时会先将两个字符串用科学计数法进行储存,因为保留16位小数,所以结果为
$str1=1.2345678901234567E+17;
$str2=1.2345678901234567E+17。
结果再比较就会产生$str1 等于 $str2 这样的结果;
解决办法为使用 === 或者strcmp等字符串比较函数进行强类型判断
另外,长度不同、在字符串中加非数字字符等等都会引起两个字符串的不等。
例如:$str1 = "a123456789012345678";
$str2 = "a123456789012345679";
此时$str1 和 $str2就不相等,因为存在a 这个非数字字符,所以系统不会讲两个字符串当成数字字符串进行比较,而是使用 2)中两个字符串比较方法。
参考链接:http://www.cnblogs.com/lwbqqyumidi/archive/2013/01/31/2887086.html
http://blog.sina.com.cn/s/blog_62e96b110100x18w.html
相关文章推荐
- php用比较运算符把数字作为字符串比较时
- PHP容易出错点:PHP中的数字与字符串比较
- PHP容易出错之二:PHP中的数字与字符串比较
- php陷阱:字符串和数字比较
- PHP 浅谈 == 和=== 中,数字和字符串比较的问题。
- PHP容易被忽略而出错陷阱 数字与字符串比较
- php 字符串和数字比较一些问题
- php两个长数字或字符串的比较大小
- PHP容易被忽略而出错陷阱-数字与字符串比较
- PHP中的数字与字符串比较
- 浅谈PHP数字字符串比较
- 一个比较字符串和一个计算N个数字阶乘之和的算法
- shell字符串比较判断是否为数字
- 判断一个字符串是否全是数字的多种方法及其性能比较(C#实现)
- php下关于中英数字混排的字符串分割问题
- php下关于中英数字混排的字符串分割问题
- asp.net 导出Excel时,解决纯数字字符串变成类似这样的 2.00908E+18 形式的代码
- js中比较数字大小和字符串的匹配对比小结
- PHP 字符串分割和比较