8
回答
PHP比较运算符,大神来看看
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

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
举报
松鼠先生
发帖于2年前 8回/547阅
共有8个答案 最后回答: 2年前

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

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

--- 共有 1 条评论 ---
eechen附上PHP大神鸟哥的权威解释: http://www.laruence.com/2009/02/21/662.html 2年前 回复

2楼已经说了,

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

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

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

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

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

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

因为PHP是非常非常非常非常非常“简单”的一门语言,这种事情有什么好纠结的
--- 共有 1 条评论 ---
eechenhttp://php.net/manual/zh/language.operators.comparison.php 手册已经说得很清楚了:如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。 2年前 回复
<?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有高精准库,特别是在数字计算上。
顶部