Как округлить результат целочисленного деления? - PullRequest
298 голосов
/ 20 августа 2008

В частности, я думаю о том, как отображать элементы управления разбиением на страницы при использовании такого языка, как C # или Java.

Если у меня есть x элементов, которые я хочу отображать кусками y на страницу, сколько страниц потребуется?

Ответы [ 16 ]

0 голосов
/ 28 февраля 2019

для C # используйте функцию Math.Ceiling:

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

и Java используют функцию Math.Ceil:

int n = (int) Math.ceil((double)myList.size() / recordsPerPage));
0 голосов
/ 07 февраля 2013

Следующее должно делать округление лучше, чем вышеупомянутые решения, но за счет производительности (из-за вычисления с плавающей запятой 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;
}
0 голосов
/ 19 марта 2012

У меня была похожая потребность, когда мне нужно было конвертировать минуты в часы и минуты. То, что я использовал, было:

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);
0 голосов
/ 28 октября 2010

Общий метод, результат которого вы можете перебрать, может представлять интерес:

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;
}
0 голосов
/ 13 августа 2010

Альтернатива для удаления ветвления при тестировании на ноль:

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

Не уверен, что это будет работать в C #, следует делать в C / C ++.

0 голосов
/ 20 августа 2008

Вы хотите выполнить деление с плавающей запятой, а затем использовать функцию потолка, чтобы округлить значение до следующего целого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...