1
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
4

2 回答 2

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/

于 2010-08-27T17:26:43.573 回答
0

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

我敢肯定有什么奇怪的,比如3.2000000001进入某个地方。也许来自数据库?


托马斯

于 2010-08-27T15:25:44.743 回答