首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不知何故,1不等于1 (PHP)

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

Stack Overflow用户
提问于 2013-09-06 17:16:45
回答 3查看 255关注 0票数 5

我有一个关联数组,其值是浮点数,这应该是概率。因此,我总结它们,并要求结果实际上是1。

代码语言:javascript
复制
$total = array_sum($array);
echo '$total = '.$total."\n";
if ($total == 1) {
    die("total is 1");
} else {
    die("total is not 1");
}

这个神秘的输出:

代码语言:javascript
复制
$total = 1
total is not 1

执行var_dump($total)会产生float(1),但是即使$total == (float)1也返回false。

到底怎么回事?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-06 17:21:22

在php (和其他语言)中浮动是不精确的,因此(float)1实际上可能是1.00000000000000123113.99999999999999823477

有关更多信息,请参见答案PHP - Floating Number Precision

票数 2
EN

Stack Overflow用户

发布于 2013-09-06 17:23:29

浮点值本质上是不精确的,而且由于存储和舍入错误的方式,它们之间很少相等。您应该通过查看这两个值是否“足够近”来比较浮点数。也就是说,将这两个值之间的差的绝对值与显著的小误差(通常称为"epsilon")进行比较。

其中一项执行可以是:

代码语言:javascript
复制
if (abs($total - 1) < 0.000000001)
    die("total is 1");
} else {
    die("total is not 1");
}

请注意,只有应用程序的需求才能真正确定什么是安全的错误范围,在什么点上应该舍入数字以供显示。

例如,如果您处理的是货币值,并且需要精确的精度,一个更好的解决方案是完全放弃浮点运算。在这种情况下,一种选择是使用整数类型并将数字存储为美分,直到最后一分钟再除数才能向用户显示数字(甚至不进行除法,而是在字符串中注入小数点)。

票数 3
EN

Stack Overflow用户

发布于 2013-09-06 17:23:24

铸成整做

代码语言:javascript
复制
if ((int)$total == 1)

它将起作用:)

编辑:甚至更好

代码语言:javascript
复制
$total = (int)array_sum($array);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18663169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档