在使用C#或Java等语言时,我正在考虑如何显示分页控件.
如果我想要以每页y块的形式显示x项,那么需要多少页?
找到优雅的解决方案:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
资料来源:编号转换,Roland Backhouse,2001年
转换为浮点和返回似乎是CPU级别的大量浪费时间.
伊恩·尼尔森的解决方案:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
可以简化为:
int pageCount = (records - 1) / recordsPerPage + 1;
AFAICS,这没有Brandon DuRette指出的溢出错误,并且因为它只使用它一次,如果它来自一个昂贵的函数来从配置文件中获取值,则不需要特别存储recordsPerPage或一些东西.
即如果config.fetch_value使用数据库查找或其他东西,这可能效率低下:
int pageCount = (records + config.fetch_value('records per page') - 1) / config.fetch_value('records per page');
这会创建一个你并不真正需要的变量,它可能具有(次要)内存含义并且输入太多:
int recordsPerPage = config.fetch_value('records per page') int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
这是一行,只获取一次数据:
int pageCount = (records - 1) / config.fetch_value('records per page') + 1;
对于C#,解决方案是将值转换为double(因为Math.Ceiling需要一个double):
int nPages = (int)Math.Ceiling((double)nItems / (double)nItemsPerPage);
在java中,您应该对Math.ceil()执行相同的操作.
这应该给你你想要的.您肯定希望x项目除以每页y项目,问题是当出现不均匀的数字时,所以如果有部分页面,我们还想添加一个页面.
int x = number_of_items; int y = items_per_page; // with out library int pages = x/y + (x % y > 0 ? 1 : 0) // with library int pages = (int)Math.Ceiling((double)x / (double)y);
Ian提供的整数数学解决方案很好,但是遇到整数溢出错误.假设变量都是变量int
,可以重写解决方案以使用long
数学并避免错误:
int pageCount = (-1L + records + recordsPerPage) / recordsPerPage;
如果records
是long
,则错误仍然存在.模数解决方案没有错误.
尼克·贝拉尔迪(Nick Berardi)回答的一个变种,它避免了一个分支:
int q = records / recordsPerPage, r = records % recordsPerPage; int pageCount = q - (-r >> (Integer.SIZE - 1));
注意:(-r >> (Integer.SIZE - 1))
由符号位组成r
,重复32次(由于>>
运算符的符号扩展.)如果r
为零或负,则计算结果为0 ,如果r
为正,则计算结果为-1 .所以从中减去它会q
增加1 if的效果records % recordsPerPage > 0
.