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
问问题
651 次
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 回答