以下测试将在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/