我正在为一个客户开发一个项目,这非常简单。但是我必须做一个计算,这也很简单,就像这个例子:
$a = (49.95 - 24.95);
if ($a == 25.00) {
echo "TRUE";
}
这相当于25.00对!但是没有它返回虚假???
但如果我这样做,另一个类似于我需要的计算的例子:
$a = (99.95 - 24.95);
if ($a == 75.00) {
echo "TRUE";
}
然后我变成了现实!我疯了,还是这个虫子?
答案 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)