[C#] 정수 나누기 결과를 반올림하는 방법은 무엇입니까?

특히 C # 또는 Java와 같은 언어를 사용할 때 페이지 매김 컨트롤을 표시하는 방법을 생각하고 있습니다.

페이지 당 y 단위로 x 개의 항목을 표시하려는 경우 몇 개의 페이지가 필요합니까?



답변

우아한 해결책을 찾았습니다.

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

출처 : 숫자 변환, 롤랜드 백 하우스, 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 #의 경우 솔루션은 값을 두 배로 캐스트하는 것입니다 (Math.Ceiling은 두 배가 됨).

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이 제공 한 정수 수학 솔루션은 훌륭하지만 정수 오버플로 버그가 발생합니다. 변수가 all이라고 가정하면 수학 int을 사용 long하고 버그를 피하기 위해 솔루션을 다시 작성할 수 있습니다 .

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

경우 recordslong, 버그 남아 있습니다. 모듈러스 솔루션에는 버그가 없습니다.


답변

브랜치를 피하는 Nick Berardi의 답변 변형 :

int q = records / recordsPerPage, r = records % recordsPerPage;
int pageCount = q - (-r >> (Integer.SIZE - 1));

참고 : (-r >> (Integer.SIZE - 1))부호 비트는 r32 번 반복됩니다 ( >>연산자 의 부호 확장 덕분에 ). r이 값은 0이거나 음수이면 0으로, 양수이면 -1 r로 평가됩니다. 따라서 그것을 빼면 q1 if를 추가하는 효과가 records % recordsPerPage > 0있습니다.


답변

레코드 == 0의 경우, rjmunro의 솔루션은 1을 제공합니다. 올바른 솔루션은 0입니다. 즉, 레코드가 0보다 크다는 것을 알고 있다면 (그리고 나는 우리가 모두 레코드 PerPage> 0이라고 가정한다고 확신한다면) rjmunro 솔루션은 정확한 결과를 제공합니다. 오버플로 문제가 없습니다.

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

모든 정수 수학 솔루션은 모든 부동 소수점 솔루션 보다 효율적 입니다.