我将如何创建自己的测试用例来找出为什么此代码 returns 有一半时间是正确答案?

How would I create my own test case to figure out why this code returns the correct answer half of the time?

我想弄清楚为什么如果我将值从 4 和 2 更改为 4 和 3 之类的值,它无法正确计算平均值。

我想知道两件事。

如何 运行 像这样简单的东西的测试用例,以及如何将我的代码修复到每次都能正确地平均出两个数字的位置。

using System;

public class MathUtils
{
    public static double Average(int a, int b)
    {
        return (a + b) / 2;
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(Average(4, 2));
    }
}

// right now returns 3 which is correct 

将其更改为:

public static double Average(int a, int b)
{
    return (a + b) / 2.0; // will be incorrect for edge case with int-overflow - see Edit 
}

原因: 如果将两个整数相加,您将得到一个整数。如果你用一个整数除以一个整数,默认情况下你会得到另一个整数——不是浮点数或双精度数。 .之后的部分被丢弃。


编辑: 正如 Hans Passant 指出的那样,如果两个 int 加起来超过 int 可以处理的数量,您可能会收到溢出错误 - 因此将它们(至少其中之一)强制转换为 double 是更明智的举动

    return ((double)a + b) / 2; // .0 no longer needed.

您需要混合一些非整数才能获得 .xxxx 部分。

至于测试用例 - 这取决于您使用的测试框架。 您可能应该考虑 (int.MinValue, int.Minvalue) , (int.MaxValue, int.MaxValue) 和一些简单的 (0,0), (1,1), (1,2)

关于如何检测错误:获得一些 C# 经验 - 或使用中间变量和断点以及调试器来查看哪里出了问题。

这里是:

public static double Average(int a, int b)
{
    var summed = a + b;
    var avg = summed / 2;

    return avg;
}

在调试中会很快指出错误。

return ((double)a + b) / 2; //simple