C# 如何使数字之和等于1

C# 如何使数字之和等于1,c#,double,C#,Double,我处理概率,我需要检查这些值的和是否为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 t

我处理概率,我需要检查这些值的和是否为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

double
不会给你那种数学所需的精度


切换到十进制,一切都会好起来。

十进制
具有您想要的精度。如果您需要10进制精度,请坚持使用
十进制


这里有一篇关于这个主题的较老但相关的文章:

几乎所有的单元测试系统都有一个断言,它检查两个值是否在某个指定的公差范围内的“接近度”。例如,NUnit Assert.AreEqual有一个重载,它使用三个双倍值,即实际值、期望值和增量值,这是前两个值可以相差的最大值,断言可以通过…

尝试编辑
如果(sum!=1.0)
另一种方法是使用int。将概率乘以100(0.4->40)。然后您可以检查
sum!=100
@razbakov概率通常用作[0,1]中的值,因此我不能使用int.mably duplicate of(注意,我不确定duplicates标记是如何工作的,但上面链接的问题并不是我误认为是dupe的问题。如果您投票关闭,请使用上面的链接,而不是选择我选择的内容。:P)@亨克·霍特曼——你可能不想这样做,但如果你想用这些数字进行精确计算,你就需要这样做。OP也没有提到任何单元测试框架。只是检查了这个,为我工作。Tnx!需要重写一些逻辑参见Jon Skeet关于和的C#文章。