例如一个令人讨厌的情况下:我们想检查一下在循环中我们的鼠标是否大于或等于3.3。 (这是所有怪异的例子来说明一个 “缺陷”)
$a="3.3";
for($i=0; $i<5 ; $i=$i+0.15){
echo "\nTesting if $i>=$a\n";
var_dump($i,$a);
if($i>=$a){
echo "$i>=$a is TRUE\n";
}else{
echo "$i>=$a is FALSE\n";
}
}
现在输出将是这一个:
Testing if 0>=3.3
int(0)
string(3) "3.3"
0>=3.3 is FALSE
Testing if 0.15>=3.3
float(0.15)
string(3) "3.3"
0.15>=3.3 is FALSE
Testing if 0.3>=3.3
float(0.3)
string(3) "3.3"
0.3>=3.3 is FALSE
Testing if 0.45>=3.3
float(0.45)
string(3) "3.3"
0.45>=3.3 is FALSE
Testing if 0.6>=3.3
float(0.6)
string(3) "3.3"
0.6>=3.3 is FALSE
Testing if 0.75>=3.3
float(0.75)
string(3) "3.3"
0.75>=3.3 is FALSE
Testing if 0.9>=3.3
float(0.9)
string(3) "3.3"
0.9>=3.3 is FALSE
Testing if 1.05>=3.3
float(1.05)
string(3) "3.3"
1.05>=3.3 is FALSE
Testing if 1.2>=3.3
float(1.2)
string(3) "3.3"
1.2>=3.3 is FALSE
Testing if 1.35>=3.3
float(1.35)
string(3) "3.3"
1.35>=3.3 is FALSE
Testing if 1.5>=3.3
float(1.5)
string(3) "3.3"
1.5>=3.3 is FALSE
Testing if 1.65>=3.3
float(1.65)
string(3) "3.3"
1.65>=3.3 is FALSE
Testing if 1.8>=3.3
float(1.8)
string(3) "3.3"
1.8>=3.3 is FALSE
Testing if 1.95>=3.3
float(1.95)
string(3) "3.3"
1.95>=3.3 is FALSE
Testing if 2.1>=3.3
float(2.1)
string(3) "3.3"
2.1>=3.3 is FALSE
Testing if 2.25>=3.3
float(2.25)
string(3) "3.3"
2.25>=3.3 is FALSE
Testing if 2.4>=3.3
float(2.4)
string(3) "3.3"
2.4>=3.3 is FALSE
Testing if 2.55>=3.3
float(2.55)
string(3) "3.3"
2.55>=3.3 is FALSE
Testing if 2.7>=3.3
float(2.7)
string(3) "3.3"
2.7>=3.3 is FALSE
Testing if 2.85>=3.3
float(2.85)
string(3) "3.3"
2.85>=3.3 is FALSE
Testing if 3>=3.3
float(3)
string(3) "3.3"
3>=3.3 is FALSE
Testing if 3.15>=3.3
float(3.15)
string(3) "3.3"
3.15>=3.3 is FALSE
Testing if 3.3>=3.3
float(3.3)
string(3) "3.3"
3.3>=3.3 is FALSE
Testing if 3.45>=3.3
float(3.45)
string(3) "3.3"
3.45>=3.3 is TRUE
Testing if 3.6>=3.3
float(3.6)
string(3) "3.3"
3.6>=3.3 is TRUE
Testing if 3.75>=3.3
float(3.75)
string(3) "3.3"
3.75>=3.3 is TRUE
Testing if 3.9>=3.3
float(3.9)
string(3) "3.3"
3.9>=3.3 is TRUE
Testing if 4.05>=3.3
float(4.05)
string(3) "3.3"
4.05>=3.3 is TRUE
Testing if 4.2>=3.3
float(4.2)
string(3) "3.3"
4.2>=3.3 is TRUE
Testing if 4.35>=3.3
float(4.35)
string(3) "3.3"
4.35>=3.3 is TRUE
Testing if 4.5>=3.3
float(4.5)
string(3) "3.3"
4.5>=3.3 is TRUE
Testing if 4.65>=3.3
float(4.65)
string(3) "3.3"
4.65>=3.3 is TRUE
Testing if 4.8>=3.3
float(4.8)
string(3) "3.3"
4.8>=3.3 is TRUE
Testing if 4.95>=3.3
float(4.95)
string(3) "3.3"
4.95>=3.3 is TRUE
而且讨厌的部分:
Testing if 3.3>=3.3
float(3.3)
string(3) "3.3"
3.3>=3.3 is FALSE
3.3大于或等于3.3,但PHP的东西不是!是没有意义的正确
现在,如果你把一个ini_set('precision', 18);
代码之前,你可以看到,评价竟是:
Testing if 3.29999999999999893>=3.3
float(3.29999999999999893)
string(3) "3.3"
3.29999999999999893>=3.3 is FALSE
所以$ I = $ I + = 0.15隐式转换$我到浮动,这将导致此问题。
对于这种情况,$ i + = 0.15应改为$ i = number_format($ i + = 0。15,2)
由于经典的浮点舍入问题。你通过将其转换为int来解决它,因为这确保了'7299'的确切值。 – BoltClock 2011-03-08 09:00:52