在C++单元测试中返回Division错误地返回为0

Returning Division in C++ Unit Test incorrectly coming back as 0

本文关键字:返回 错误 Division 单元测试 C++      更新时间:2023-10-16

我正在使用已构建的Visual Studio 2015框架对C++函数进行单元测试。然而,测试失败了,并表示实际值为0。如果我返回(y2 - y1),那么我得到的值是99。如果我返回(x2 - x1),我得到86400,但如果我返回(y2 - y1) / (x2 - x1),我得到零。为什么会这样?我需要对Assert::AreEqual()做些什么来告诉它处理浮动吗?即使我在浮点中进行除法,然后返回变量,我仍然得到零?

float averageGradient(int x1, int x2) {
    //do some maths, the result of which: y1=-39, y2= 60, x1=683675, x2=770075
    float m = (y2 - y1) / (x2 - x1);
    return (y2 - y1) / (x2 - x1);
}

我称之为以下单元测试:

TEST_METHOD(Average_Gradient) {
        int x1 = 683675;
        int x2 = x1 + 86400;
        float gradient = averageGradient(x1, x2);
        float answer = 0.001145833;
        Assert::AreEqual(answer, gradient);
    }

即使我在浮点中进行除法,然后返回变量,我仍然得到零?

那不是你要做的。

float averageGradient(int x1, int x2) {
    //do some maths, the result of which: y1=-39, y2= 60, x1=683675, x2=770075
    float m = (y2 - y1) / (x2 - x1);
    return (y2 - y1) / (x2 - x1);
}

首先对ints进行除法运算,并将结果(0)分配给float。然后你再次对int进行除法运算并返回。

整数除法的结果只是截断它,并给出一个int作为结果。如果你想得到一个float作为结果,那么在进行除法之前,你必须至少向float抛出一个参数:

float averageGradient(int x1, int x2) {
    //do some maths, the result of which: y1=-39, y2= 60, x1=683675, x2=770075
    float m = (y2 - y1) / (float)(x2 - x1);
    return m;
}

应该这样做。

此外,你从哪里得到y1y2,因为你不把它们当作论据?这些是全局变量吗?

您应该返回声明为浮点的m变量,而不是计算。您的返回应该简单地说:return m;