将分子除以非零分母总是在c#中给出零

时间:2016-06-08 20:44:31

标签: c# linq

这是我的代码

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

谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

1230是整数。

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;