2013-10-10 91 views
3

我正在为一个客户端的项目工作,其相当简单。但有一个计算,我必须做的也很简单,就像这个例子:与PHP的奇怪减法结果

$a = (49.95 - 24.95); 
if ($a == 25.00) { 
    echo "TRUE"; 
} 

这等于25.00吧!但没有它返回假?

但如果我这样做,类似于计算另一个例子,我需要:

$a = (99.95 - 24.95); 
if ($a == 75.00) { 
    echo "TRUE"; 
} 

然后我得到真正的!我会生气,还是这是一个bug?

+3

你可以**从来没有**,*** *** ***比较浮点值的平等。 Google或等待某人发布相关链接。 :-) – Jon

+0

这是数学... http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Leri

+1

必备xkcd卡通:http://www.xkcd.com/217/ – Reeno

回答

2

就像你可以阅读手册,不要直接比较float。请使用epsilon

<?php 
$a = 1.23456789; 
$b = 1.23456780; 
$epsilon = 0.00001; 

if(abs($a-$b) < $epsilon) { 
    echo "true"; 
} 

这是因为PHP内存如何浮动的方式。你可以阅读手册,例如。这里http://pl1.php.net/float

+0

谢谢,下次不会忘记:) – user2863313

2

这不是一个错误。这是关于float number precision。由于浮点数以小数精度存储,因此不能依赖精确比较操作,如==(相等比较)。

相反,你shoult使用精密三角洲和比较花车,如:

$a = (49.95 - 24.95); 
$b = 25; 
$delta = 1E-13; 

if(abs($a-$b)<$delta) 
{ 
    echo('TRUE'); 
} 

在PHP中,1E-13将使用精密增量是不够的。有关浮点数及其表示形式,请参见this指南。

+0

谢谢你,这完美的工作,我只是无法让我头大概为什么第一个例子不工作,第二个是。 – user2863313

1
$a = (49.95 - 24.95); 
if ((int)$a == 25) { 
    echo "TRUE"; 
} 
0

在第一个例子中,有一个浮点数与一个整数相比较,第二个例子中浮点数与浮点数相比较。由于浮点精度而导致的差异并不是一个错误。

为了解决这个可以定义d (delta)数目,这将是计算的精度

然后就可以检查是否的x-y绝对结果将是较低的,那么您所限定的精度。像这样的东西if(abs(x-y) < d)