【问题标题】:Difference between syntaxes语法之间的区别
【发布时间】:2013-10-02 02:22:51
【问题描述】:

我正在为我的网格视图开发自定义寻呼机控件。

我使用以下语法来获取页面数:

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

我得到了想要的结果,但无法理解为什么上面的语法没有给出想要的结果。

当我在第一种情况下进行调试时,我观察到 dblpagecount 得到的结果是 8.0 insted of 8.2

任何人都可以澄清一下,上述陈述是如何工作的吗?

【问题讨论】:

标签: c# gridview type-conversion


【解决方案1】:

我假设totrecords 和grdPages.PageSize 都是int 类型。因此,不管是 dblpagecount 的类型,你最终会以整数算术执行除法,它会截断为 0。但是,我实际上不会使用你的第二段代码(当然不会同时使用double 和 decimal - 混合它们几乎总是一个坏主意)。相反,我会使用:

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

这将有效地“四舍五入”,而无需任何浮点运算。

【讨论】:

  • @Jon Skeet 执行整数除法不会导致任何浮点运算?我想我假设浮点运算无论如何都会发生(它是除法),但结果被有效地截断了。
  • @ChristopherRucinski:这将是一个整数机器码操作。我真的希望不需要通过浮点代码...
【解决方案2】:

简单回答

int / int = int

如果你想得到一个十进制类型的数字(这里讲数学,也就是任何带有小数的数字,从 3.0 到 3.14159),你必须执行类似...

double / int = double

int / double = double

所以只要投一个值,你就很好了,这就是为什么下面的工作......

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

请注意,不需要外部强制转换,内部强制转换应该是 double 类型!请阅读我在下面的评论,以了解您在此处所做的总体思路。

【讨论】:

  • 顺便说一句,我认为外部double演员是不必要的。 DecimalTotRecords / IntGrdPages_PageSize 产生 double 表达式。然后你将该双精度转换为双精度,然后分配给dblPagecount
  • @ChristopherRucinski:不,它不会——将decimal 除以int 得到decimal,而不是double。这确实不是一个好方法。它过于复杂,完全没有意义地混合不同的浮点类型。
  • @JonSkeet 是的,对不起,我比我想象的要困一点。 general 的想法是正确的,我更新了我的答案。 OP 大致理解了我所说的内容,我想提供有关如何评估表达式的见解。
  • 我仍然不同意“而且你很好” - 我个人仍然更愿意看到“不需要浮点”的方法。
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 2011-10-09
  • 2012-02-27
  • 2021-05-17
相关资源
最近更新 更多