我使用概率,我需要检查值的总和是1.我正在编写单元测试,其中一个测试失败了。这就是它失败的原因:
double[] probabilities = new[] { 0.4, 0.3, 0.2, 0.1 };
double sum = probabilities.Sum();
//On my PC gives sum of 0.99999999999999989
if (sum != 1)
{
throw new ArgumentException(
"Sum of the probabilities does not equal to 1. " +
"Computed value was: " + sum);
}
我可以做些什么来改变这一点:0.4 + 0.3 + 0.2 + 0.1 = 1
?
答案 0 :(得分:6)
double
不会为你提供这种数学所需的精确度。
切换到decimal
,一切都会好的。
答案 1 :(得分:1)
decimal
具有您想要的精度。如果您需要10精度,请坚持使用decimal
。
以下是关于该主题的较旧但相关的文章:What Every Computer Scientist Should Know About Floating-Point Arithmetic
答案 2 :(得分:1)
几乎所有的单元测试系统都有一个断言,它检查双倍的“接近度”这两个值在某个指定的容差范围内。例如,NUnit Assert.AreEqual有一个重载,它需要三个双精度值,即实际值,期望值和delta值,这是前两个值可以通过Assert传递的最大值... < / p>