首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用==运算符比较浮点数/双精度值

使用==运算符比较浮点数/双精度值
EN

Stack Overflow用户
提问于 2011-07-27 05:46:14
回答 9查看 30.1K关注 0票数 19

当我开始使用相等运算符比较两个浮点值时,我使用的代码审查工具抱怨如下。正确的方法是什么,怎么做?有没有我可以重用的助手函数(commons-*)?

描述

无法使用等于(==)运算符比较浮点值

说明

由于舍入误差,使用相等(==)或不等式(!=)运算符比较浮点值并不总是准确的。

Recommendation

比较这两个浮点值,看看它们的值是否接近。

代码语言:javascript
运行
复制
float a;
float b;

if(a==b)
{
..
}
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-07-27 06:12:46

用于比较两个浮点数的IBM has a recommendation,使用除法而不是减法-这使得选择适用于所有输入范围的epsilon变得更容易。

代码语言:javascript
运行
复制
if (abs(a/b - 1) < epsilon)

至于epsilon的值,我会使用this Wikipedia table中给出的5.96e-08,或者可能是这个值的2倍。

票数 33
EN

Stack Overflow用户

发布于 2011-07-27 05:51:19

它希望您将它们进行比较,使其在所需的精确度内。例如,如果您要求浮点数的前4位十进制数相等,则可以使用:

代码语言:javascript
运行
复制
if(-0.00001 <= a-b && a-b <= 0.00001)
{
..
}

或者:

代码语言:javascript
运行
复制
if(Math.abs(a-b) < 0.00001){ ... }

将所需精度与两个数字的差值相加,并将其与所需精度的两倍进行比较。

您认为更具可读性的内容。我自己更喜欢第一个,因为它清楚地显示了你在两边都允许的精确度。

a = 5.43421b = 5.434205将通过比较

票数 10
EN

Stack Overflow用户

发布于 2011-07-27 05:49:33

代码语言:javascript
运行
复制
private static final float EPSILON = <very small positive number>;

if (Math.abs(a-b) < EPSILON)
   ...

由于浮点数为您提供了可变但无法控制的精度(即,您不能在使用doublefloat之间进行选择时设置精度),因此您必须选择自己的固定精度进行比较。

请注意,这不再是真正的等价运算符,因为它不是可传递的。你可以很容易地得到a等于bb等于c,但a不等于c

编辑:还要注意,如果a是负数,而b是一个非常大的正数,则减法可能会溢出,结果将是负无穷大,但测试仍将工作,因为负无穷大的绝对值是正无穷大,这将大于EPSILON__。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6837007

复制
相关文章

相似问题

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