可能重复:
比较 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。
知道为什么吗?
可能重复:
比较 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。
知道为什么吗?
浮点数的 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
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)