我将如何创建自己的测试用例来找出为什么此代码 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
我想弄清楚为什么如果我将值从 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