Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不知何故,1并不等于1(PHP)_Php_Equality - Fatal编程技术网

不知何故,1并不等于1(PHP)

不知何故,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),但即使是

我有一个关联数组,它的值是浮点数,应该是概率。因此,我总结它们,并要求结果实际上是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,那么它将通过测试