【问题标题】:Why does this xUnit test fail?为什么这个 xUnit 测试会失败?
【发布时间】:2010-08-27 15:18:10
【问题描述】:
Assert.Equal(1000000.0, table.Convert("g", "mcg", 1.0)); // Pass
Assert.Equal(2000000.0, table.Convert("g", "mcg", 2.0)); // Pass
Assert.Equal(3200000.0, table.Convert("g", "mcg", 3.2)); // Fail
// The failing one is equal to doing the following calculation, which fails also:
Assert.Equal(3200000.0, 3.2 * 1.0 / (1.0 / 1000000.0));  // Fail
Assert.Equal(3200000.0, 3.2 * (1.0 / (1.0 / 1000000.0)));// Pass, WTF?!?!
===================================================================    
Assert.Equal() Failure
    Expected: 3200000
    Actual:   3200000

【问题讨论】:

  • Table.Convert 的代码在哪里?数据类型有哪些?您可能正在使用 Double 或 Float,因为它们的相等性很棘手。
  • 好点。添加了计算,这也失败了。我正在使用“双重”。

标签: unit-testing double assert xunit xunit.net


【解决方案1】:

由于运算顺序不同,浮点二进制舍入误差的传播方式似乎不同。使用 Decimal 类型可以获得“不那么令人惊讶”但可能更慢的结果。

3.2 * 1.0 / (1.0 / 1000000.0) -> 3200000.0000000005

(试试(3.2 * 1.0 / (1.0 / 1000000.0) ).ToString("R");

3.2 * (1.0 / (1.0 / 1000000.0)) -> 3200000.0

如果你还不了解浮点和十进制类型的区别,请阅读:http://docs.sun.com/source/806-3568/ncg_goldberg.html

或者,如果您更喜欢通俗易懂的英语: http://floating-point-gui.de/

【讨论】:

    【解决方案2】:

    Yoe 无法从您的代码 sn-p 中看到它,但我很确定这与您的第一行(通过的行)有一个 .0 而失败的一个事实有关逗号后面有不等于零的东西。

    我敢肯定会有像3.2000000001 这样奇怪的东西出现在某个地方。也许来自数据库?

    HTH!
    托马斯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      相关资源
      最近更新 更多