3

我正在为客户做一个项目,这很简单。但是我必须做一个计算,它也很简单,就像这个例子:

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

这等于 25.00 对!但是没有它的返回错误???

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

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

那我就当真了!我要疯了,还是这是一个错误???

4

4 回答 4

2

就像您可以阅读手册一样,不要直接比较浮点数。而是使用epsilon.

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

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

这是因为 PHP 存储在内部浮动的方式。您可以在手册中阅读它,例如。这里http://pl1.php.net/float

于 2013-10-10T12:25:17.870 回答
2

这不是一个错误。这是关于浮点数精度。由于浮点数以十进制精度存储,因此您不能依赖精确的比较操作,例如==(相等比较)。

相反,您应该使用精度增量并比较浮点数,例如:

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

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

在 PHP 中,1E-13 足以用作精度增量。有关非常简单的解释,请参阅有关浮点数及其表示的本指南。

于 2013-10-10T12:26:25.947 回答
1
$a = (49.95 - 24.95);
if ((int)$a == 25) {
    echo "TRUE";
}
于 2013-10-10T12:34:37.330 回答
0

在第一个示例中,有一个浮点数与一个 int 数进行比较,而在第二个示例中,有一个浮点数与一个浮点数进行了比较。差异是由于浮点精度而不是错误而发生的。

为了解决这个问题,您可以定义一个d (delta)数字,该数字将是计算的精度

然后你可以检查绝对结果x-y是否会低于你定义的精度。像这样的东西if(abs(x-y) < d)

于 2013-10-10T12:34:54.187 回答