【问题标题】:unit testing double digit fails单元测试两位数失败
【发布时间】:2012-08-09 09:37:01
【问题描述】:

我正在测试方差方法(单元),但出现双重问题。

    public double Variance()
    {
        return Probablity * (1 - Probablity);
    }

    [Test]
    public void Variance_WithSuccessProbablity02_Returns016()
    {
        var bernoulli = new BernoulliDistribution(0.2);

        Assert.AreEqual(bernoulli.Variance(), 0.16);
    }

这个测试结果是返回失败。 失败:预期:0.160000000000003d 但为 0.16d

【问题讨论】:

  • 现在真正的注意事项:您的问题是什么?您知道这是一个“双重问题”——您希望我们怎么做?
  • 好吧 0.2d * 0.8d 不完全是 0.16d ! !但使用小数可以帮助解决这个问题
  • 看看我下面的回复,它应该会给你你需要的代码更新。如果它有效,请不要忘记接受它:-)

标签: c# unit-testing testing tdd nunit


【解决方案1】:

在 NUnit 中,您可以使用显式容差比较浮点值:

Assert.AreEqual( double expected, double actual, double tolerance );

或者您可以将GlobalSettings.DefaultFloatingPointTolerance 全局设置为非零值(默认为0.0)。

有更多关于浮点比较的信息here

在你的具体情况下,我建议你试试这个:

Assert.AreEqual(bernoulli.Variance(), 0.16, 1.0e-9);

【讨论】:

    【解决方案2】:

    使用浮点数或双精度数时经常会出现此类精度问题。

    您需要从差异中考虑一个小的“差异”(请原谅双关语)。

    【讨论】:

      【解决方案3】:
      Assert.IsTrue(Math.Abs(bernoulli.Variance() - 0.16d) < 0.00001d);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 2020-02-14
        相关资源
        最近更新 更多