PHP 개발에서 Ceil () 함수는 종종 반올림하는 데 사용되지만 때로는 결과가 우리가 기대하는 정수가 아니며 종종 혼란 스럽습니다. 실제로,이 상황의 근본적인 이유는 부동 소수점 번호의 표현 및 작동 오류입니다. 이 기사는이 문제의 원인을 자세히 분석하고 효과적인 솔루션을 제공합니다.
Ceil () 함수의 기능은 숫자를 위쪽으로 반올림 하고 그 숫자보다 가장 작은 정수를 반환하는 것입니다. 예를 들어:
<?php
echo ceil(3.2); // 산출 4
echo ceil(7.0); // 산출 7
?>
정상적인 상황 에서이 기능은 간단하고 직관적입니다.
경우에 따라 CEIL () 함수는 다음과 같은 비정상적인 결과를 갖습니다.
<?php
$num = 1.9999999999999998;
echo ceil($num); // 结果산출 2,기대를 충족시킵니다
$num = 1.9999999999999996;
echo ceil($num); // 结果산출 1,뜻밖에
?>
후자는 왜 2 대신 1 의 결과가 있습니까? 이것은 실제로 부동 소수점 수의 정확도 제한 때문입니다.
PHP의 부동 소수점은 IEEE 754 표준을 기반으로 한 이중 정제 부동 소수점 수입니다. 이 표현에는 고유 한 정확도 제한이있어 일부 소수성을 정확하게 표현할 수 없습니다. 예를 들어:
<?php
var_dump(0.1 + 0.2);
// 산출 float(0.30000000000000004)
?>
수학 작업을 수행 할 때 이러한 작은 오류가 축적되어 Ceil () 에 의해 처리 된 수치 값이 실제로 예상보다 약간 작거나 약간 큽니다.
다음 예를 고려하십시오.
<?php
$num = 2.0000000000000004;
echo ceil($num); // 산출 3
$num2 = 1.9999999999999996;
echo ceil($num2); // 산출 2,그러나 실제 희망은입니다 2
?>
NUM2는 2 미만으로 보이지만 부동 소수점 정밀성으로 인해 2보다 약간 작은 숫자로 저장되어 Ceil ()가 1 대신 최대 2 개를 둥글게합니다.
이러한 유형의 오류는 재무 계산, 측정 단위 및 기타 시나리오에서 심각한 문제를 일으킬 수 있습니다.
먼저 라운드 () 함수를 사용하여 소수점 이하 자리 수를 제한 한 다음 Ceil ()을 사용하여 처리 할 수 있습니다.
<?php
$num = 1.9999999999999996;
$num = round($num, 8); // 예약하다8십진수
echo ceil($num); // 结果산출 2,기대를 충족시킵니다
?>
이 방법은 부동 소수점 오류의 영향을 효과적으로 줄입니다.
정확도 요구 사항이 매우 높으면 PHP의 BCMATH 기능을 사용할 수 있습니다.
<?php
$num = "1.9999999999999996";
$result = bcadd($num, '0', 0); // 예약하다0십진수,아래쪽으로 반올림하는 것과 같습니다
if (bccomp($num, $result, 10) > 0) {
$result = bcadd($result, '1', 0);
}
echo $result; // 산출 2
?>
BCMATH는 문자열을 사용하여 부동 소수점 오류를 피하고 숫자를 나타냅니다.
숫자 범위에서 허용되면 먼저 숫자를 확대 할 수 있습니다.
<?php
$num = 1.9999999999999996;
$scale = 8;
$num_scaled = (int)($num * pow(10, $scale));
$num_ceil = ceil($num_scaled / pow(10, $scale));
echo $num_ceil; // 산출 2
?>
이 방법은 또한 플로팅 포인트 정확도 오류의 문제를 완화 할 수 있습니다.
PHP의 부동 소수점 수는 기본 이진 표현으로 인해 정확도 오차가 있습니다.
CEIL () 함수 자체는 오류가 발생하지 않지만 오류는 입력 매개 변수를 예상치 못하게하여 결과에서 편차를 초래합니다.
Round () , BCMath Extension 또는 축소 기술을 사용하여 문제를 효과적으로 피하십시오.
플로팅 포인트 수의 특성을 이해하고 적절한 조치를 취하면 CEIL ()은 PHP 프로젝트에서 정확하고 신뢰할 수있는 역할을 할 수 있습니다.