我有一个关联数组,其值为浮点数,它们应该是概率。因此,我总结它们并要求结果实际上是1。
$total = array_sum($array);
echo '$total = '.$total."\n";
if ($total == 1) {
die("total is 1");
} else {
die("total is not 1");
}
这神秘地输出:
$total = 1
total is not 1
执行var_dump($total)
会产生float(1)
,但即使$total == (float)1
也会返回false。
发生了什么事?
答案 0 :(得分:3)
浮点值本质上是不精确的,并且由于它们的存储方式和舍入错误而很少彼此相等。您应该通过查看两个值是否“足够接近”来比较浮点数。也就是说,将两个值之差的绝对值与极小的误差范围(通常称为“epsilon”)进行比较。
一个这样的实现可能是:
if (abs($total - 1) < 0.000000001)
die("total is 1");
} else {
die("total is not 1");
}
请注意,只有您的应用程序的要求才能真正确定安全误差范围是什么,以及在什么时候应该舍入数字以进行显示。
如果您正在处理货币值,例如,并且需要精确的精度,则更好的解决方案是完全放弃浮点运算。在这种情况下,一种选择是使用整数类型并将数字存储为美分,仅在最后一分钟显示向用户显示数字(或者甚至不分割,而是在字符串中注入小数点)。 / p>
答案 1 :(得分:2)
php(和其他语言)中的浮点数不准确,因此(float)1
可能实际上是1.00000000000000123113
或.99999999999999823477
有关详细信息,请参阅答案PHP - Floating Number Precision
答案 2 :(得分:1)
施放到int做
if ((int)$total == 1)
它会起作用:)
编辑: 甚至更好
$total = (int)array_sum($array);