当前位置: 首页 > 知识库问答 >
问题:

C++两个double值的比较不能正常工作[duplicate]

易修洁
2023-03-14

看看这段代码:

#include <cmath>
#include <iostream>
using namespace std;
class Sphere
{
    double r;
public:
    double V() const { return (4/3) * 3.14 * pow(r,3); }
    bool equal(const Sphere& s) const
    {
        cout  << V() << " == " << s.V() << " : " << ( V() == s.V() );
        return ( V() == s.V() );

    }

    explicit Sphere(double rr = 1): r(rr){}

};
main()
{
    Sphere s(3);
    s.equal(s);
}

输出为84.78==84.78:0,这意味着相同的方法并不是每次都返回相同的值,即使所有参数都是静态的?

double V() const { return (4/3) * 3.0 * pow(r,3); }

这是怎么回事?我需要这个方法,用于我的程序,它将比较两个对象的体积,但这是不可能的?我敲打我的头这么长时间,想弄清楚是什么原因造成的问题,幸运的是我找到了,但现在我不明白为什么??是与编译器(GCC)有关,还是我在这里遗漏了一些重要的东西?

共有1个答案

海鸣
2023-03-14

使用==运算符比较浮点值很容易出错;本应相等的两个值可能不是由于算术舍入错误造成的。比较这些的常用方法是使用Epsilon:

bool double_equals(double a, double b, double epsilon = 0.001)
{
    return std::abs(a - b) < epsilon;
}
 类似资料:
  • 这是一个Java代码,应该测试小数点后的前三位是否相同。而我需要编写这个程序没有一个主方法。

  • 我正在将边添加到PriorityQueue,但由于某些原因,它们没有按其值进行排序,从而导致以后出现错误的结果。 我的边缘班是这样的 然而,当我运行我的代码,在属于节点“Springfield,MO”的LinkedList中将所有内容添加到PriorityQueue时,边按错误的顺序排序,如下图所示,问题是什么? 我尝试为Edge创建一个特定的比较器类,并将其用作PriorityQueue中的参数

  • 问题内容: Java中两个double值的简单比较会产生一些问题。让我们考虑以下Java中的简单代码段。 上面的代码似乎返回,表达式的求值,但是没有。它之所以返回,是因为该表达式的求值实际上是预期的因此不等于,因此条件的求值为。解决这种情况的最佳建议方法是什么? 问题答案: 基本上,你不应该进行精确比较,而应该执行以下操作:

  • 问题内容: 我有一份詹金斯工作,后来被克隆和修改。现在,我想比较两个作业的配置。不是历史更改,不是结果,而是两个作业的配置。 是否可以比较两个Jenkins作业的配置? 问题答案: 尝试: 要么

  • 正如您所知,在支持库23.2之后,当您将RecycerView作为wrap_content放在scrollview中时,滚动事件可以通过使用正常工作。但是,如果一个scrollview中有两个recycylerview,那么第二个recycylerview不会按其内容大小进行包装。有办法实现吗?

  • 在一个JUnit4测试中,我有一个方法,它返回一个对象,我要将它与引用列表进行比较。到目前为止,我发现的最佳解决方案是使用和,如下所示: 对于只返回很少值的测试来说,这是很好的。但是如果一个测试返回更多的值,这肯定不是最好的方法。 我还尝试了下面的代码。要编译代码,需要在之前向下转换到: 对比失败了,不明白为什么: java.lang.AssertionError:预期:(包含<[<0.2>的<1