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
因为两边都是数字字符串,所以会自动按照数值型进行比较。而由于整数超过了操作系统支持的最大整型,所以PHP只能转为科学计数法整数(是浮点型),自动转换时精度保持是有限的,只会保持12位小数点精度
两边的字符串都转为了这个科学计数浮点数 6.152951945281E+31,所以比较结果为: true
2楼已经说了,
第一,字符串比较,如果是数字内容的话会转为数字比较。
第二,数字太大会变成float,float的实现在各种语言都一样会丢失精度。
所以会出现两个看起来不等于的大数会相等。
至于不同版本间的差异,可能和某些实现的变更有关,我没了解过这方面的信息。
字符串比较应该用恒等于===或者strcmp.
PHP中字符串跟数字比较时,字符串会被转化为数字后进行比较,转化过程类似intval():
echo intval('5stars'); 输出5
var_dump('5stars'==5); 输出bool(true)
var_dump('5stars'===5); 输出bool(false)
最后一个溢出了好吧!所以其实比较的是前面那一部分!是一样的!
没有用恒等,而且全数字,所以都是数字大小在比!
var_dump( (bcsub('11111111111111111000000000000000' ,'111111111111111111111111111111',100)>0 ? true:false) );
php有高精准库,特别是在数字计算上。