不知何故,1并不等于1(PHP)
我有一个关联数组,它的值是浮点数,应该是概率。因此,我总结它们,并要求结果实际上是1不知何故,1并不等于1(PHP),php,equality,Php,Equality,我有一个关联数组,它的值是浮点数,应该是概率。因此,我总结它们,并要求结果实际上是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\u转储($total)会产生float(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\u转储($total)
会产生float(1)
,但即使是$total==(float)1也会返回false
发生了什么事?php(和其他语言)中的浮点值不精确,因此(float)1
实际上可能是1.00000000000000 123113
或.9999999999999 823477
有关更多信息,请参见答案
if ((int)$total == 1)
它将起作用:)
编辑:
甚至更好
$total = (int)array_sum($array);
浮点值本质上是不精确的,由于它们的存储方式和舍入误差,它们很少彼此相等。您应该通过查看这两个值是否“足够接近”来比较浮动。也就是说,将两个值之间差值的绝对值与非常小的误差(通常称为“ε”)进行比较
其中一种实施方式可以是:
if (abs($total - 1) < 0.000000001)
die("total is 1");
} else {
die("total is not 1");
}
if(abs($total-1)<0.00000000 1)
死亡(“总数为1”);
}否则{
死亡(“总数不是1”);
}
请注意,只有您的应用程序的需求才能真正确定安全误差范围是多少,以及在什么情况下数字应该四舍五入显示
例如,如果您处理的是货币值,并且需要精确的精度,那么更好的解决方案是完全放弃浮点运算。这种情况下的一种选择是使用整数类型并将数字存储为美分,仅在最后一分钟进行除法以向用户显示数字(或者甚至不除法,而是在字符串中插入小数点)。可能重复@miken32不完全相同。这个问题是关于一般的浮点运算问题。这个问题是关于PHP的var_dump函数意外地执行舍入(而不是转储var)有没有办法让PHP告诉我它的实际值是什么?print(number_格式($myNumber,32);
应该让您以某种程度的精度看到它是什么,但据我所知,您无法看到确切的值。whargbl“0.99999999999988897769753748435”-我不知道var_dump会这样循环,不幸的是,这对我正在尝试做的事情毫无帮助(请参见问题的顶部)。如果我的值被搞砸了-这段代码要检查什么-并且总和实际上是1.3,那么它将通过测试