为什么这个xUnit测试失败了?

时间:2010-08-27 15:18:11

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

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

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

Yoe无法从你的代码片段中看到它,但我很确定它与你的第一行(传递的)有一个.0,而失败的那一行有关在逗号后有一些不等于零的东西。

我确信3.2000000001会出现在某个地方。也许来自数据库?

HTH!
托马斯