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
答案 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!
托马斯