PHP的奇怪减法结果

时间:2013-10-10 12:23:24

标签: 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";
}

然后我变成了现实!我疯了,还是这个虫子?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

相反,你应该使用精确增量并比较浮点数:

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在第一个例子中,有一个浮点数与一个int数进行比较,第二个是浮点数与浮点数相比。出现差异的原因是浮点精度并且不是错误。

要解决此问题,您可以定义一个d (delta)数字,它将是计算的精确度

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