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 ()가 정확한 부동 소수점 값을 수신하도록 유형과 정밀도를 명시 적으로 처리하는 것입니다.
사용 (플로트) 캐스트 :
<code> $ totalpages = ceil ((float) $ totalitems / (float) $ itemsperpage);
</코드>
intdiv () 및 ceil ()을 사용하여 혼합하지 마십시오. 정수 부서를 사용해야하는 경우 나머지를 기준으로 판단하는 것이 좋습니다.
<code> $ totalpages = intdiv ($ totalitems, $ itemsperpage);
if ($ totalitems % $ itemsperpage> 0) {
$ totalpages += 1;
}
</코드>
사용자 또는 API의 입력의 경우 intval () 대신 floatVal ()을 사용하는 것이 좋습니다.
PHP의 CEIL () 함수를 사용하는 경우 소수점이 나누기로 제대로 처리되지 않으면 논리적 오류를 일으키기가 매우 쉽습니다. 특히 페이징 또는 카운팅 로직에서 결과는 "거의 올바른"것처럼 보일 수 있지만 실제 정확도 취약점이 있습니다.
개발자는 암시 적 유형 변환 및 정수 부서의 함정에주의를 기울여야하며 데이터 유형에 민감하게 유지되며 명시 적 변환 및 합리적인 판단을 통해 프로그램 논리의 엄격함과 정확성을 보장해야합니다.