Math.Round() - LINQ查询

4

我正在运行一个使用本地“let”变量计算本地值以与传递到查询中的参数进行比较的LINQ查询。

我有以下查询:

Items = from lead in Items
        let total = lead.NurtureActions.Count(q => !q.Deleted)
        let completed = lead.NurtureActions.Count(nurtureAction => nurtureAction.Completed && !nurtureAction.Deleted)
        let percentage = Math.Round((Double)((completed/total)*100),0,MidpointRounding.ToEven)
        where 
            total>0 && 
            percentage == progress
        select lead;

上面真正重要的部分是以下一行:

let percentage = Math.Round((Double)((completed/total)*100),0,MidpointRounding.ToEven)

如您所见,在我的查询中,我正在将该查询的结果与传递到我的函数中的“progress”进行比较。
例如:我可能会传入值“8”,因此“progress”将具有值“8”。但是计算出的“percentage”可能最初为“8.223”,但我需要将其四舍五入为“8”。
我认为我做得很正确,但由于某种原因,有些东西没有正常工作。
有什么想法可能导致四舍五入失效吗?我也尝试过四舍五入的“AwayFromZero”选项,但也不起作用。
编辑 对于那些要求更多信息的人,我不确定它正在计算什么值。我没有调试LINQ查询的经验,也不知道从何处开始查找该值。如果我知道如何获取它,我会提供它。

3
发生了什么?在调试器中你看到了什么值? - SLaks
“…某些东西没有正常工作。” 它是什么没有正常工作?你看到了什么?它是在应该向下舍入时向上舍入吗? - Kiril
你已经两次说了某些东西“不起作用”,但没有说明实际发生了什么。 - Jon Skeet
antisanity - 我希望它根据MidpointRound设置正确地四舍五入。如果它在中点以上,则向上舍入,否则向下舍入。 - TheJediCowboy
4
那是你所“想要”的。你真正得到了什么? - John Saunders
1个回答

7
随机猜测:`total` 和 `completed` 是 `int` 类型,所以 `(completed/total)` 的结果被截断了。截断后的值乘以 100,然后再转换为 `double` 类型。
我猜这在某些情况下会产生意外的结果,如果你希望 `(completed/total)` 返回一个 `double` 类型的值。
修复方法:
let total = (double)lead.NurtureActions.Count(...)
let completed = (double)lead.NurtureActions.Count(...)
let percentage = Math.Round((completed/total)*100, ...)

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