我有一个关联数组,其值是浮点数,这应该是概率。因此,我总结它们,并要求结果实际上是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。
到底怎么回事?
发布于 2013-09-06 17:21:22
在php (和其他语言)中浮动是不精确的,因此(float)1实际上可能是1.00000000000000123113或.99999999999999823477。
有关更多信息,请参见答案PHP - Floating Number Precision
发布于 2013-09-06 17:23:29
浮点值本质上是不精确的,而且由于存储和舍入错误的方式,它们之间很少相等。您应该通过查看这两个值是否“足够近”来比较浮点数。也就是说,将这两个值之间的差的绝对值与显著的小误差(通常称为"epsilon")进行比较。
其中一项执行可以是:
if (abs($total - 1) < 0.000000001)
die("total is 1");
} else {
die("total is not 1");
}请注意,只有应用程序的需求才能真正确定什么是安全的错误范围,在什么点上应该舍入数字以供显示。
例如,如果您处理的是货币值,并且需要精确的精度,一个更好的解决方案是完全放弃浮点运算。在这种情况下,一种选择是使用整数类型并将数字存储为美分,直到最后一分钟再除数才能向用户显示数字(甚至不进行除法,而是在字符串中注入小数点)。
发布于 2013-09-06 17:23:24
铸成整做
if ((int)$total == 1)它将起作用:)
编辑:甚至更好
$total = (int)array_sum($array);https://stackoverflow.com/questions/18663169
复制相似问题