这是我的代码
DataTable dt=STP_GetRenewalResultsReportData(Convert.ToDateTime("06-07-2015"),Convert.ToDateTime("06-07-2016")).Tables[0];
(
from r in
(
from d in dt.AsEnumerable()
group d by d.Field<string>("CityID") into grpCity
select new{
CityID = grpCity.Key,
City = (from g in grpCity where g.Field<string>("CityID") == grpCity.Key select g.Field<string>("City")).First().Trim(),
PotentialRenewalCount = (from g in grpCity where g.Field<string>("CityID") == grpCity.Key select g.Field<int>("PotentialRenewalCount")).Sum(),
// PotentialRenewalCount = 205,
PotentialRenewalSQRT = (from g in grpCity where g.Field<string>("CityID") == grpCity.Key select g.Field<double>("PotentialRenewalSQFT")).Sum(),
RENEWALCOUNT = (from g in grpCity where g.Field<string>("CityID") == grpCity.Key select g.Field<int>("RENEWALCOUNT")).Sum(),
// RENEWALCOUNT = 23,
RENEWALSQRT = (from g in grpCity where g.Field<string>("CityID") == grpCity.Key select g.Field<double>("RENEWALSQRT")).Sum(),
}
)
select new{
CityID=r.CityID,
City=r.City,
PotentialRenewalCount=r.PotentialRenewalCount,
PotentialRenewalSQRT=r.PotentialRenewalSQRT,
RENEWALCOUNT=r.RENEWALCOUNT,
RENEWALSQRT=r.RENEWALSQRT,
LeaseNoPercentage=Convert.ToDouble(12/30)
}
).Dump();
现在当你看到底部的这一行
LeaseNoPercentage = Convert.ToDouble(12/30)
我将一个非常小的数字除以30,结果当精确结果为0.4时我得到0
所以我的问题是如何在这个LINQ而不是0
中得到0.4谢谢你的帮助
答案 0 :(得分:1)
12
和30
是整数。
12/30
执行整数除法,并生成0
。
将0
int转换为double会导致0
双倍。
由于您说您的代码正在运行,我将假设您对Convert.ToDouble
的调用不会抛出任何与sql相关的异常,如果是这种情况,则应执行以下操作:工作
LeaseNoPercentage=Convert.ToDouble(12)/Convert.ToDouble(30)
这样,你就可以double
除以整数除法,它应该导致0.4
答案 1 :(得分:1)
这与Linq无关。你的表达
LeaseNoPercentage = Convert.ToDouble(12/30)
首先评估12/30。两个参数都是整数,因此结果为0。
然后将该结果传递给Convert.ToDouble()。将整数0转换为double会产生0.0。
要避免此问题,您需要在执行除法之前将12和30转换为double。最直接的方法是将它们写为12.0和30.0。如果你的真实代码有整数变量而不是常量(让我们称之为num和denom),你可以这样做:
LeaseNoPercentage = (double)num / (double)denom;