PHP比较运算符,大神来看看

松鼠先生 发布于 2015/11/03 16:52
阅读 672
收藏 0
PHP

http://php.net/manual/zh/language.operators.comparison.php#114682

哪位大神来解释下,最后一个运算。


补充:下面这个也比较困惑

var_dump('11111111111111111000000000000000' == '11111111111111111111111111111111');
var_dump('11111111111111110000000000000000' == '11111111111111111111111111111111');



这两个输出,在PHP5.2和5.5版本,输出不同

php5.2.17: true,false

php5.5: false,false

加载中
2
朱__朱
朱__朱

因为两边都是数字字符串,所以会自动按照数值型进行比较。而由于整数超过了操作系统支持的最大整型,所以PHP只能转为科学计数法整数(是浮点型),自动转换时精度保持是有限的,只会保持12位小数点精度

两边的字符串都转为了这个科学计数浮点数 6.152951945281E+31,所以比较结果为: true

eechen
eechen
附上PHP大神鸟哥的权威解释: http://www.laruence.com/2009/02/21/662.html
1
聽雨人
聽雨人

2楼已经说了,

第一,字符串比较,如果是数字内容的话会转为数字比较。

第二,数字太大会变成float,float的实现在各种语言都一样会丢失精度。

所以会出现两个看起来不等于的大数会相等。

至于不同版本间的差异,可能和某些实现的变更有关,我没了解过这方面的信息。

0
fly2xiang
fly2xiang
Both strings are getting converted to floats, then losing precision, then becoming equal :-(
0
纠结名字
PHP真是高大上的语言,完全理解不了!
纠结名字
回复 @聽雨人 : 你家PHP怎么说都有理,所以我觉得高大上!
聽雨人
聽雨人
回复 @纠结名字 : 这个还真,不纠结,我们家PHP就是这么拽,为什么,因为数据库取出来的表单拿到的特么都是字符串,那么猜用户是想比较数字很正常吧,比较字符串就用strcmp了。PHP是一个优秀的架构,对业务开发开放,对底层复杂封闭。符合开发的开闭原则。
纠结名字
回复 @聽雨人 : 求教还有哪些语言会把引号里的字符串强转数字的?
聽雨人
聽雨人
呵呵。
0
eechen
eechen
不要用==比较字符串.
字符串比较应该用恒等于===或者strcmp.
PHP中字符串跟数字比较时,字符串会被转化为数字后进行比较,转化过程类似intval():
echo intval('5stars');  输出5
var_dump('5stars'==5);  输出bool(true)
var_dump('5stars'===5); 输出bool(false)
百世经纶之傲笑红尘
百世经纶之傲笑红尘
你这个问题接近js里的3.000000000000001==3,呵呵,我笑而不语
松鼠先生
松鼠先生
我知道不要这样用,我是说这种情况应该解释,想明白原理
0
军师ives

最后一个溢出了好吧!所以其实比较的是前面那一部分!是一样的!
没有用恒等,而且全数字,所以都是数字大小在比!

0
景愿
景愿
因为PHP是非常非常非常非常非常“简单”的一门语言,这种事情有什么好纠结的
eechen
eechen
http://php.net/manual/zh/language.operators.comparison.php 手册已经说得很清楚了:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。
0
梦想岛
梦想岛
<?php

var_dump(  (bcsub('3.00000000000000000000000000000000000000001',3,100)>0 ? true:false) );
var_dump(  (bcsub('3.000000000000000000000000000000000000000000000000001',3,100)>0 ? true:false) );

var_dump(  (bcsub('11111111111111111000000000000000' ,'111111111111111111111111111111',100)>0 ? true:false) );

php有高精准库,特别是在数字计算上。
返回顶部
顶部