2013-09-26 103 views
0

我正在开发自定义寻呼机控件到我的网格视图。语法之间的区别

我使用下面的语法来获得无页:

dblpagecount = (doble)(totrecords/grdPages.PageSize); 
pagecount = (int)Math.Ceiling(dblPagecount); 

使用上述语法,如果没有的记录是41和页面大小为5,然后我得到PAGECOUNT为8应该是9 。

如果我使用下面的语法,

double dblPagecount = (double)((decimal)totrecords /grdPages.PageSize); 
pagecount = (int)Math.Ceiling(dblPagecount); 

我得到确切的页数即9

我得到了期望的结果,但无法理解为什么上述synatax没有给出预期的结果。

当我在第一种情况下调试,我观察到dblpagecount是获得结果作为8.0 insted的8.2

任何一个可以请澄清,说明如何上面的作品?

+0

totrecords和grdPages.PageSize都是int吗? – Muctadir

+0

请看这个答案http://stackoverflow.com/questions/10851273/why-integer-division-in-c-sharp-returns-an-integer-but-not-a-float –

+0

也许你是一个前VB。 NET开发人员。 VB.NET在整数除法行为不同http://stackoverflow.com/questions/6013626/vb-net-vs-c-sharp-integer-division –

回答

0

答案很简单

int/int = int

如果你想获得一个小数型数(这里数学说话,又名任意数量的3.0至3.14159它十进制),你必须做一些像...

double/int = double

int/double = double

所以只投上e值为,你是好,这就是为什么下面的作品...

double dblPagecount = (double)((decimal)totrecords /grdPages.PageSize);

请注意,外投是不需要的,和内投应该是double类型的!请阅读我的评论以获取您在此处所做的总体想法

+0

噢..说明..谢谢..我现在明白了.. –

+0

顺便说一句,外面的'双'''''我觉得是不必要的。 'DecimalTotRecords/IntGrdPages_PageSize'产生一个'double'表达式。然后,你将这个double赋给double,然后赋值给'dblPagecount' –

+0

@ChristopherRucinski:不,它不会 - 用'int'来分隔decimal,给出一个decimal,而不是double。这真的不是一个好方法。它过于复杂,并且完全毫无意义地混合了不同的浮点类型。 –

1

我假设totrecordsgrdPages.PageSize都是int类型。因此,不管类型的dblpagecount,你最终将在整数算术中执行的分割,它将截断为0.但是,我不会实际使用你的第二段代码(当然不会使用都doubledecimal - 混合这些几乎总是一个坏主意)。相反,我只是使用:

// Names changes slightly for readability 
int pageCount = (totalRecords + grdPages.PageSize - 1)/grdPages.PageSize; 

这将有效地“四舍五入”而不需要任何浮点操作。

+0

哇..尼斯绝招:) +1这个.. –

+0

@Jon Skeet执行整数除法结果没有任何浮点运算?我想我假设浮点运算发生(无论是除法),但结果被有效截断。 –

+0

@ChristopherRucinski:这将是一个整数机器码操作。我真的希望不需要通过浮点代码去...... –