为什么c#聚合评估返回错误的值?

时间:2019-01-22 11:49:17

标签: aggregate

List<decimal>scontiList = new List<decimal>();
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
scontiList.Add((decimal)50.0m);
decimal cento = (decimal)100.0d;
decimal ris = scontiList.Aggregate((decimal)0.0m, (a, b) =(decimal)((decimal)1 - ((decimal)a / (decimal)cento)) * (decimal)((decimal)1 - ((decimal)b / (decimal)cento)));

-> ris 0.4975125

为什么在这种情况下ris = 0,4975125? 正确的是0.125

1 个答案:

答案 0 :(得分:0)

聚集从种子值开始,运行您指定的函数并将结果存储回累加器。然后继续前进,重复此循环

您的种子为0(第一次迭代中给定current_value的值)

您的操作是(1 - current_value/100) * (1 - next_value/100)

您的值全部为50,因此您的操作实际上是:curr = (1 - curr / 0.5) * 0.5

进度因此是:

Seed: (1 - 0/100) * 0.5 = 0.5
Step 1: (1 - 0.5/100) * 0.5 = 0.4975
Step 2: (1 - 0.4975/100) * 0.5 = 0.4975125

如您所见,它的价格稳定在0.4975。它永远不会达到0.125。该十进制数字将越来越长(更多数字),但始终约为0.4975