在下面的Linq代码中,计数为16,总和为21,这是正确的。但是,分数总是显示为100.应该是76.19。发生了什么事?
另外,我尝试得分= sum / count,但我似乎无法使用新部分中的变量。有什么建议吗?
.GroupBy(g => g.YR_MNTH)
.Select(x =>
new
{
count = x.Count(),
sum = x.Sum(i=>i.SCORE >= 95? 1:0),
score = (decimal)Math.Round((decimal)(x.Sum(i => i.SCORE >= 95 ? 1 : 0) / x.Count()) * 100, 2)
});
答案 0 :(得分:1)
问题在于query
是x.Count()
而int
是x.Sum(i=>i.SCORE >= 95? 1:0)
。 int
除以int
是int
。 21除以16的整数除法是1然后乘以100.你需要移动你的十进制数并将它放在括号内的一个操作数上;像这样,例如:int
。 (decimal)x.Sum(i => i.SCORE >= 95 ? 1 : 0)
除以decimal
将导致int
,因此您将重新开始营业。
另一方面,多次执行这些聚合并不是最有效的方法。
答案 1 :(得分:1)
对整数执行数学运算会产生整数。所以如果你做这样的事情:
def data(self, index, role):
if not index.isValid() or role != QtCore.Qt.DisplayRole: return
结果将不为1 / 2
,它只是0.5
。所以这个:
0
将导致整数。稍后将该整数转换为小数将不会在事后更改其值。您需要在对它们执行数学运算之前转换各个值:
x.Sum(i => i.SCORE >= 95 ? 1 : 0) / x.Count()