以下测试将在C#中失败

Assert.AreEqual<double>(10.0d, 16.1d - 6.1d);


该问题似乎是浮点错误。

16.1d - 6.1d == 10.000000000000002


这使我为使用double的代码编写单元测试时感到头疼。有没有办法解决这个问题?

最佳答案

十进制与双精度的二进制表示之间没有精确的转换(请参见下面@PatriciaShanahan的出色评论,以了解原因)。

在这种情况下,数字的.1部分就是问题,它不能以双精度形式有限地表示(例如1/3不能精确地以十进制数形式有限地表示)。

一个代码片段,说明发生了什么:

double larger = 16.1d; //Assign closest double representation of 16.1.
double smaller = 6.1; //Assign closest double representation of 6.1.
double diff = larger - smaller; //Assign closest diff between larger and
                                //smaller, but since a smaller value has a
                                //larger precision the result will have better
                                //precision than larger but worse than smaller.
                                //The difference shows up as the ...000002.


比较双精度时,请始终使用带有Assert.Equal参数的delta overload

另外,如果您确实需要精确的十进制转换,请使用decimal数据类型,该数据类型具有另一个二进制表示形式,并且在示例中将完全返回10

关于c# - 为什么这个简单的双重声明在C#中失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18300743/

10-09 09:18