2013-03-06 97 views
0

我在比较php中的这两个值并不相等,但是在比较它时显示的是相等的。如果php不工作?

<?php 
if(2012111809055570004==2012111809055570002) 
    echo "aa"; 
else 
    echo "n"; 
?> 

O/P - AA

我不知道为什么?

+3

您使用的是32位还是64位系统? – datasage 2013-03-06 20:27:18

+0

'echo gettype(2012111809055570004);' – 2013-03-06 20:28:00

+3

大数字通常表示为浮点数,这本质上是不精确的。请参见[PHP数学精确](http://stackoverflow.com/questions/3726721/php-math-precision) – mario 2013-03-06 20:28:29

回答

0

我的猜测是他们都不在int范围内,所以他们会被转换为float,他们靠近并表明他们是平等的。

2

可能是这两个数字在浮点表示中完全相同。

+0

你的代码中有什么新东西 – Shreya 2013-03-06 20:30:11

+0

你可以给我代码比较 – Shreya 2013-03-06 20:39:39

7

这些数字太大而不能作为整数处理,因此它们被视为浮点数,并且它们太靠近以便进行浮点比较以区分差异。

+0

所以如何做比较 – Shreya 2013-03-06 20:31:18

+0

看起来你想比较日期和时间。尝试使用DateTime类(http://php.net/manual/en/class.datetime.php)。 – user1618143 2013-03-06 20:33:57

+0

不我不是比较日期 – Shreya 2013-03-06 20:39:22

1

你的整数变成科学记数法中的浮点数(即2.012111809055570004e18)。

检查这个问题的帮助:How to compare large number in PHP?

+0

你可以给我比较的代码 – Shreya 2013-03-06 20:40:38

+0

请参阅@ Kolink的答案。你可以让他们字符串和比较,或者你需要安装BCMath,你会使用if(bccomp($ val1,$ val2))。 http://www.php.net/manual/en/function.bccomp.php – Schleis 2013-03-06 20:43:59

3
C:\Users\Kolink>php -r "var_dump(2012111809055570004);" 
float(2.0121118090556E+18) 

如图所示,PHP不能存储数字,在大的整数格式,而且必须诉诸浮点数。因此,单元级精度是不可能的,你会得到像这样的不寻常的比较。

修复将涉及使用字符串来保存号码,或使用大号码扩展名,如BCMath

+0

你可以给我的代码比较 – Shreya 2013-03-06 20:39:59

+0

那么第一个选项只是你已经有的代码,但用数字引号。我从来没有用过BCMath,但我只知道这一点,所以我无法帮助第二个人。 – 2013-03-06 20:41:10

0

该数字太大,不能视为整数。因此,这将比较浮点值。浮动值得到较大值但不能得到最后两个数字。所以这个条件是真的。

0

我得到了我的答案我用===而不是==现在它的工作。