2

可能重复:
比较 php 中的浮点数

我有以下代码:

$a = 1.49;
$b = 1.50;

echo $b - $a; // Outputs 0.01, which is ok

if (($b - $a) != 0.01) {
        echo "Not ok";
} else {
        echo "Ok";
}

问题是 if 语句回显“Not ok”,尽管减法结果是 0.01。

知道为什么吗?

4

2 回答 2

4

浮点数的 PHP文档显示了如何比较它们

如上面的警告所述,测试浮点值是否相等是有问题的,因为它们在内部表示的方式。但是,有一些方法可以绕过这些限制来比较浮点值。

为了测试浮点值是否相等,使用了由于舍入导致的相对误差的上限。该值称为机器 epsilon 或单位舍入,是计算中可接受的最小差异。

<?php
// $a and $b are equal to 5 digits of precision.
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

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

应用于您的示例:

$c = $b - $a;
$epsilon = 0.00001;

if (abs($a-$b-0.01) < $epsilon) {
        echo "Not ok";
} else {
        echo "Ok";
}

输出OK

于 2012-10-27T20:24:31.237 回答
3

it's because some floating point operations. the result isn't exactly 0.01. your output is rounded by the system.

just try var_dump(($b-$a)-0.01). this should be float(8.673617379884E-18)

a solution would be if (round($b - $a,2) != 0.01)

于 2012-10-27T20:24:09.207 回答