如何取整整数除法的结果?

时间:2020-03-05 18:41:06  来源:igfitidea点击:

我特别在考虑使用诸如Cor Java之类的语言时如何显示分页控件。

如果我有x个项目要以每页y个块的形式显示,那么需要多少个页面?

解决方案

回答

我们需要进行浮点除法,然后使用上限函数将值四舍五入到下一个整数。

回答

另一种选择是使用mod()函数(或者'%')。如果存在非零的余数,则将除法的整数结果递增。

回答

这应该给我们我们想要的。我们肯定希望每页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);

回答

对于C,解决方案是将值转换为双精度值(因为Math.Ceiling需要双精度值):

int nPages = (int)Math.Ceiling((double)nItems / (double)nItemsPerPage);

在Java中,我们应该对Math.ceil()执行相同的操作。

回答

找到了一个优雅的解决方案:

int pageCount = (records + recordsPerPage - 1) / recordsPerPage;

资料来源:数字转换,Roland Backhouse,2001年

回答

Ian提供的整数数学解决方案很好,但存在整数溢出错误。假设变量全部为" int",则可以将解决方案重写为使用" long"数学运算,并避免错误:

int pageCount =(-1L +记录+ recordsPerPage)/ recordsPerPage;

如果recordslong,则该bug仍然存在。模数解决方案没有错误。

回答

在CPU级别,转换为浮点数和返回浮点数似乎是对时间的巨大浪费。

伊恩·尼尔森(Ian Nelson)的解决方案:

int pageCount = (records + recordsPerPage - 1) / recordsPerPage;

可以简化为:

int pageCount = (records - 1) / recordsPerPage + 1;

AFAICS,它没有Brandon DuRette指出的溢出错误,并且由于它只使用一次,因此,如果它来自昂贵的函数来从配置文件中获取值或者某物。

IE。如果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;

回答

对于记录== 0,rjmunro的解决方案给出1. 正确的解决方案是0。也就是说,如果我们知道记录> 0(并且我确定我们都假设recordsPerPage> 0),那么rjmunro的解决方案就会给出正确的结果,并且没有任何溢出问题。

int pageCount = 0;
if (records > 0)
{
    pageCount = (((records - 1) / recordsPerPage) + 1);
}
// no else required

所有整数数学解都将比任何浮点解都更有效率。

回答

在零测试中删除分支的替代方法:

int pageCount = (records + recordsPerPage - 1) / recordsPerPage * (records != 0);

不知道这是否可以在C#中使用,应该在C / C ++中使用。

回答

我们可以迭代其结果的通用方法可能引起兴趣:

public static Object[][] chunk(Object[] src, int chunkSize) {

    int overflow = src.length%chunkSize;
    int numChunks = (src.length/chunkSize) + (overflow>0?1:0);
    Object[][] dest = new Object[numChunks][];      
    for (int i=0; i<numChunks; i++) {
        dest[i] = new Object[ (i<numChunks-1 || overflow==0) ? chunkSize : overflow ];
        System.arraycopy(src, i*chunkSize, dest[i], 0, dest[i].length); 
    }
    return dest;
}