Ian*_*son 454
找到优雅的解决方案:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Run Code Online (Sandbox Code Playgroud)
资料来源:编号转换,Roland Backhouse,2001年
rjm*_*nro 185
转换为浮点和返回似乎是CPU级别的大量浪费时间.
伊恩·尼尔森的解决方案:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Run Code Online (Sandbox Code Playgroud)
可以简化为:
int pageCount = (records - 1) / recordsPerPage + 1;
Run Code Online (Sandbox Code Playgroud)
AFAICS,这没有Brandon DuRette指出的溢出错误,并且因为它只使用它一次,如果它来自一个昂贵的函数来从配置文件中获取值,则不需要特别存储recordsPerPage或一些东西.
即如果config.fetch_value使用数据库查找或其他东西,这可能效率低下:
int pageCount = (records + config.fetch_value('records per page') - 1) / config.fetch_value('records per page');
Run Code Online (Sandbox Code Playgroud)
这会创建一个你并不真正需要的变量,它可能具有(次要)内存含义并且输入太多:
int recordsPerPage = config.fetch_value('records per page')
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Run Code Online (Sandbox Code Playgroud)
这是一行,只获取一次数据:
int pageCount = (records - 1) / config.fetch_value('records per page') + 1;
Run Code Online (Sandbox Code Playgroud)
Hup*_*pie 73
对于C#,解决方案是将值转换为double(因为Math.Ceiling需要一个double):
int nPages = (int)Math.Ceiling((double)nItems / (double)nItemsPerPage);
Run Code Online (Sandbox Code Playgroud)
在java中,您应该对Math.ceil()执行相同的操作.
Nic*_*rdi 67
这应该给你你想要的.您肯定希望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);
Run Code Online (Sandbox Code Playgroud)
Bra*_*tte 18
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));
Run Code Online (Sandbox Code Playgroud)
注意:(-r >> (Integer.SIZE - 1))
由符号位组成r
,重复32次(由于>>
运算符的符号扩展.)如果r
为零或负,则计算结果为0 ,如果r
为正,则计算结果为-1 .所以从中减去它会q
增加1 if的效果records % recordsPerPage > 0
.
需要扩展方法:
public static int DivideUp(this int dividend, int divisor)
{
return (dividend + (divisor - 1)) / divisor;
}
Run Code Online (Sandbox Code Playgroud)
这里没有检查(溢出DivideByZero
等),如果您愿意,可以随意添加。顺便说一下,对于那些担心方法调用开销的人来说,像这样的简单函数无论如何都可能被编译器内联,所以我认为这不是需要关注的地方。干杯。
PS,您可能会发现意识到这一点也很有用(它会得到剩余部分):
int remainder;
int result = Math.DivRem(dividend, divisor, out remainder);
Run Code Online (Sandbox Code Playgroud)
如何在 C# 中四舍五入整数除法的结果
我很想知道在 C# 中执行此操作的最佳方法是什么,因为我需要在循环中执行此操作多达近 10 万次。其他人使用Math发布的解决方案在答案中排名靠前,但在测试中我发现它们很慢。Jarod Elliott 提出了一种更好的策略来检查 mod 是否产生任何东西。
int result = (int1 / int2);
if (int1 % int2 != 0) { result++; }
Run Code Online (Sandbox Code Playgroud)
我在循环中运行了 100 万次,花了 8 毫秒。这是使用Math的代码:
int result = (int)Math.Ceiling((double)int1 / (double)int2);
Run Code Online (Sandbox Code Playgroud)
在我的测试中运行时间为 14 毫秒,相当长。
归档时间: |
|
查看次数: |
183527 次 |
最近记录: |