如何使数字的总和等于1

4

我从事概率相关的工作,需要检查值的总和是否为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?此问题与IT技术无关。

尝试编辑 if (sum != 1.0) - Aleksey Razbakov
另一种方法是使用 int。将您的概率乘以 100(0.4 -> 40)。然后您可以检查 sum != 100 - Aleksey Razbakov
@razbakov 概率通常被用作[0,1]范围内的值,因此我无法使用 int。 - oleksii
1
可能是C# Maths gives wrong results!的重复问题。 - cHao
(注意,我不确定重复标记的事情如何工作,但是上面链接的问题并不是我错误地投票为重复的问题。如果您投票关闭,请使用上面的链接,而不是选择我选择的链接。:P) - cHao
3个回答

6

double 不会为你提供那种类型的数学精度。

转换为 decimal,一切都会变得很好。


@Henk Holterman - 你可能不想这样做,但如果你想要使用这些数字进行精确计算,你就需要这样做。此外,OP也没有提到任何单元测试框架。 - Justin Niessner
刚刚检查了一下,对我有效。谢谢!需要重写一些逻辑。 - oleksii

1

1
请参阅Jon Skeet关于二进制浮点数和十进制浮点数的C#文章:Binary Floating PointDecimal Floating Point - Brian

1
几乎所有的单元测试系统都有一个断言函数,用于检查浮点数是否“接近”,即两个值是否在某个指定的精度范围内。例如,NUnit的 Assert.AreEqual 函数就提供了一个额外的参数 delta 值,它是实际值和期望值之间允许的最大差距,只有当这个差距小于等于 delta 时,断言才会通过...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接