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

c# java math

168595 观看

16回复

35405 作者的声誉

在使用C#或Java等语言时,我正在考虑如何显示分页控件。

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

作者: Ian Nelson 的来源 发布者: 2008 年 8 月 20 日

回应 (16)


-4

51640 作者的声誉

您将要执行浮点除法,然后使用ceiling函数将值向上舍入为下一个整数。

作者: Kibbee 发布者: 20.08.2008 01:29

2

12857 作者的声誉

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

作者: Jarod Elliott 发布者: 20.08.2008 01:30

62

45582 作者的声誉

这应该给你你想要的。您肯定希望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);
作者: Nick Berardi 发布者: 20.08.2008 01:31

61

9120 作者的声誉

对于C#,解决方案是将值转换为double(因为Math.Ceiling需要一个double):

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

在java中,您应该对Math.ceil()执行相同的操作。

作者: Huppie 发布者: 20.08.2008 01:33

422

35405 作者的声誉

决定

找到优雅的解决方案:

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

资料来源:编号转换,Roland Backhouse,2001年

作者: Ian Nelson 发布者: 20.08.2008 01:42

17

3780 作者的声誉

Ian提供的整数数学解决方案很好,但是遇到整数溢出错误。假设变量都是变量int,可以重写解决方案以使用long数学并避免错误:

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

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

作者: Brandon DuRette 发布者: 18.09.2008 09:01

173

18499 作者的声誉

转换为浮点和返回似乎是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;
作者: rjmunro 发布者: 02.02.2009 01:26

4

1021 作者的声誉

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

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

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

作者: Mike 发布者: 11.02.2009 10:18

0

142 作者的声誉

替代在测试零时删除分支:

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

不确定这是否适用于C#,应该在C / C ++中使用。

作者: flux 发布者: 13.08.2010 03:26

-1

9 作者的声誉

一个通用方法,您可以迭代的结果可能是有意义的:

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;
}
作者: Jeremy Hadfied 发布者: 28.10.2010 02:09

7

38469 作者的声誉

尼克·贝拉尔迪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

作者: finnw 发布者: 04.05.2011 01:00

-2

1 作者的声誉

我有类似的需求,我需要将分钟转换为小时和分钟。我用的是:

int hrs = 0; int mins = 0;

float tm = totalmins;

if ( tm > 60 ) ( hrs = (int) (tm / 60);

mins = (int) (tm - (hrs * 60));

System.out.println("Total time in Hours & Minutes = " + hrs + ":" + mins);
作者: Richard Parsons 发布者: 19.03.2012 01:47

-2

1 作者的声誉

以下应该比上述解决方案更好地舍入,但是以牺牲性能为代价(由于0.5 * rctDenominator的浮点计算):

uint64_t integerDivide( const uint64_t& rctNumerator, const uint64_t& rctDenominator )
{
  // Ensure .5 upwards is rounded up (otherwise integer division just truncates - ie gives no remainder)
  return (rctDenominator == 0) ? 0 : (rctNumerator + (int)(0.5*rctDenominator)) / rctDenominator;
}
作者: Jim Watson 发布者: 07.02.2013 03:02

1

3234 作者的声誉

我执行以下操作,处理任何溢出:

var totalPages = totalResults.IsDivisble(recordsperpage) ? totalResults/(recordsperpage) : totalResults/(recordsperpage) + 1;

如果有0结果,请使用此扩展名:

public static bool IsDivisble(this int x, int n)
{
           return (x%n) == 0;
}

此外,对于当前页码(未被询问但可能有用):

var currentPage = (int) Math.Ceiling(recordsperpage/(double) recordsperpage) + 1;
作者: Sam Jones 发布者: 04.02.2014 09:36

3

4366 作者的声誉

需要扩展方法:

    public static int DivideUp(this int dividend, int divisor)
    {
        return (dividend + (divisor - 1)) / divisor;
    }

这里没有检查(溢出DivideByZero等),如果你愿意,可以随意添加。顺便说一句,对于担心方法调用开销的人来说,编译器可能会简单地编写这样的简单函数,所以我不认为这是关注的地方。干杯。

PS你可能会发现它也很有用(它得到余数):

    int remainder; 
    int result = Math.DivRem(dividend, divisor, out remainder);
作者: Nicholas Petersen 发布者: 15.09.2016 07:52

0

408 作者的声誉

对于C#使用Math.Ceiling函数:

var pageCount= Math.Ceiling((double)myList.Count() / recordsPerPage);

和Java使用Math.Ceil函数:

int n = (int) Math.ceil((double)myList.size() / recordsPerPage));
作者: Hamed Naeemaei 发布者: 28.02.2019 10:21
32x32