是围绕一个正确的方式进行浮动 - 双重比较

Raú*_*año 3 c++ algorithm comparison performance

这个问题为基础,众所周知,我们不应该将equals比较运算应用于十进制变量,因为数字错误(它没有绑定到编程语言):

bool CompareDoubles1 (double A, double B)
{
   return A == B;
}
Run Code Online (Sandbox Code Playgroud)

它的代码是不对的.我的问题是:

  1. 将这两个数字四舍五入然后进行比较是正确的吗?
  2. 它效率更高?

例如:

bool CompareDoubles1 (double A, double B)
    {
       double a = round(A,4);
       double b = round(B,4)
       return a == b;
    }
Run Code Online (Sandbox Code Playgroud)

它是正确的?

编辑

我正在考虑round是一个采用double(number)和int(precition)的方法:

bool round (float number, int precision);
Run Code Online (Sandbox Code Playgroud)

编辑 我认为用这个比较方法可以更好地理解我对这个问题的意思:

bool CompareDoubles1 (double A, double B, int precision)
        {
           //precition could be the error expected when rounding
           double a = round(A,precision);
           double b = round(B,precision)
           return a == b;
        }
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 5

通常,如果您真的需要比较浮动值,则需要指定容差:

bool CompareDoubles1 (double A, double B, double tolerance)
{
   return std::abs(A - B) < tolerance;
}
Run Code Online (Sandbox Code Playgroud)

选择合适的公差将取决于值的性质和产生它们的计算.

舍入是不合适的:两个非常接近的值,你想要比较相等,可能会在不同的方向上舍入并且看起来不相等.例如,当舍入到最接近的整数,0.3并且0.4将比较相等,但0.4999990.500001不会.