현재 위치: > 최신 기사 목록> PHP의 CEIL () 함수를 사용할 때 많은 사람들이 소수점 처리를 무시하고 계산을 나누어 결과에서 오류가 발생하는 이유는 무엇입니까?

PHP의 CEIL () 함수를 사용할 때 많은 사람들이 소수점 처리를 무시하고 계산을 나누어 결과에서 오류가 발생하는 이유는 무엇입니까?

M66 2025-07-10

PHP 프로그래밍에서 CEIL () 함수는 종종 부동 소수점 번호를 위쪽으로 반올림하는 데 사용됩니다. 특히 페이징, 가격 계산 및 배치 처리와 같은 시나리오에서. 그러나 디비전 작업과 함께 사용될 때, 소수점이 엄격하게 처리되지 않으면 감지 할 수없는 논리 오류가 발생할 수 있습니다. 이 기사는이 일반적인 오해와 그 해결책을 파헤칠 것입니다.

오해 예 : 페이징 로직의 오류

총 95 개의 데이터로 페이지 당 10 개의 데이터를 표시하는 페이징 시스템을 상상해보십시오. 총 페이지 수를 계산하는 일반적인 방법은 다음과 같습니다.

<code> $ totalitems = 95; $ itemsperpage = 10; $ totalpages = Ceil ($ totalitems / $ itemsperpage); Echo $ TotalPages; // 출력 : 10 </code>

이 간단한 예에서는 출력이 정확합니다. 그러나 $ totalitems 의 값 소스가 사용자 입력 또는 외부 API 또는 정수 분할 결과를 사용하는 것과 같이 불확실하면 문제가 발생할 수 있습니다.

예를 들어:

<code> $ totalitems = intval ( "95.4"); // 오류 $ itemsperpage = 10에 의해 95로 처리됩니다. $ totalpages = Ceil ($ totalitems / $ itemsperpage); // 실제 기대치는 10 페이지 Echo $ TotalPages입니다. // 실제 출력 : 10 </code>

이 결과는 정확하지만 총계가 94.1 이라고 가정하면 정수에 캐스팅하면 한 번의 계수가 줄어 듭니다.

<code> $ totalitems = intval ( "94.1"); // 94 $ TotalPages = CEIL ($ totalitems / 10)으로 처리됩니다. // CEIL (9.4) => 10 </code>

예를 들어, 계속해서 추진하면 소수점을 얻기 위해 다른 계산에 의존하지만, 분할 결과를 플로팅 포인트 번호로 명시 적으로 변환하지는 않습니다.

<code> $ totalitems = 94; $ itemsperpage = 10; $ totalpages = Ceil ($ totalitems / $ itemsperpage); // CEIL (9.4) => 10 </code>

올바른 결과는 여전히 여기에서 출력됩니다. 그러나 대신 divisor를 사용하는 경우 :

<code> $ totalpages = Ceil (intdiv ($ totalitems, $ itemsperpage)); // intdiv (94, 10) => 9 </code>

intdiv ()가 소수 부분을 직접 파산하고 둥근 결과와 Ceil ()이 의미를 잃었 기 때문에이 결과는 잘못입니다.

깊은 이유 : 암시 적 전환 및 반올림 오해

많은 개발자들은 Ceil ()을 사용하는 한 결과가 정확해야한다고 생각하고 입력 ceil ()가 정확한 부동 소수점 번호가되어야한다는 것을 무시합니다. 디비전 프로세스의 특정 부분이 나눌 수 있거나 중간 결과가 유형 변환으로 인해 소수점 이외의 장소에서 폐기되면 CEIL ()은 잘못된 입력에 따라 실행될 수 있습니다.

또한 일부 데이터베이스는 문자열 인 경우 결과를 반환하면 PHP는 기본적으로 변환 할 때 오류가 발생합니다.

<code> $ result = "94.8"; // 데이터베이스에서 얻은 문자열 $ totalpages = CEIL ($ result / 10); // 부동 소수점 번호로 자동 변환하지만 형식이 올바른지 확인하십시오 </code>

결과가 쉼표로 분리 된 소수성 (유럽 형식)을 사용하는 것과 같은 비표준 형식으로 처리되면 플로팅 포인트 번호로 올바르게 변환되지 않으므로 Ceil () 의 출력에 영향을 미칩니다.

권장되는 올바른 접근 방식

위의 문제를 피하기 위해 권장되는 접근법은 Ceil ()가 정확한 부동 소수점 값을 수신하도록 유형과 정밀도를 명시 적으로 처리하는 것입니다.

  1. 사용 (플로트) 캐스트 :

    <code>

$ totalpages = ceil ((float) $ totalitems / (float) $ itemsperpage);
</코드>

  1. intdiv ()ceil ()을 사용하여 혼합하지 마십시오. 정수 부서를 사용해야하는 경우 나머지를 기준으로 판단하는 것이 좋습니다.

    <code>

$ totalpages = intdiv ($ totalitems, $ itemsperpage);
if ($ totalitems % $ itemsperpage> 0) {
$ totalpages += 1;
}
</코드>

  1. 사용자 또는 API의 입력의 경우 intval () 대신 floatVal ()을 사용하는 것이 좋습니다.

<code> $ totalitems = floatVal ($ _ get [ 'Total'] ?? 0); </코드>

요약

PHP의 CEIL () 함수를 사용하는 경우 소수점이 나누기로 제대로 처리되지 않으면 논리적 오류를 일으키기가 매우 쉽습니다. 특히 페이징 또는 카운팅 로직에서 결과는 "거의 올바른"것처럼 보일 수 있지만 실제 정확도 취약점이 있습니다.

개발자는 암시 적 유형 변환 및 정수 부서의 함정에주의를 기울여야하며 데이터 유형에 민감하게 유지되며 명시 적 변환 및 합리적인 판단을 통해 프로그램 논리의 엄격함과 정확성을 보장해야합니다.