PHP 개발에서 Ceil () 함수는 종종 부동 소수점 번호를 반올림하는 데 사용됩니다. 그러나 많은 개발자들이 Ceil ()를 사용할 때 예기치 않은 정확도 예외 문제를 겪습니다. 이 기사는 CEIL ()이 비정상적인 데이터 정확도를 일으키는 이유를 자세히 분석 하고이 문제를 효과적으로 피하기 위해 몇 가지 방법을 소개합니다.
Ceil () 은 PHP의 내장 수학적 함수로, 부동 소수점 번호를 가장 가까운 정수까지 반올림하는 데 사용됩니다. 예를 들어:
<?php
echo ceil(4.1); // 산출 5
echo ceil(9.999); // 산출 10
?>
Ceil () 의 기능은 간단하고 명확하지만 입력은 부동 소수점 번호이며 부동 소수점 번호 자체는 표현 정확도 문제가 있습니다.
부동 소수점 숫자는 컴퓨터의 바이너리에 저장되며, 많은 소수점 소각은 유한 바이너리 비트로 정확하게 표현할 수 없습니다. 예를 들어, 0.1 은 부동 소수점 표현에서 이진 소수의 무한 루프이며, 실제 저장된 값의 약간의 편차를 초래합니다.
Ceil () 함수를 호출 할 때 부동 소수점 번호의 실제 저장된 값이 예상보다 약간 작거나 약간 큰 경우 Ceil ()은 예상과 일치하지 않는 결과를 얻을 수 있습니다.
예를 들어:
<?php
$num = 1.9999999999999999;
echo ceil($num); // 예상됩니다 2,사실입니다 2
$num = 1.0000000000000001;
echo ceil($num); // 예상됩니다 2,그러나 사실입니다 1,플로팅 포인트 저장 근사치는보다 적습니다 1.0000000000000001
?>
현재 소수점 이후 차이가있는 것으로 보이지만 실제로 부동 소수점 저장의 오류로 인해 발생합니다. Ceil ()는 실제 근사치에 따라 위쪽으로 둥글며 예상치 못한 결과가 발생할 수 있습니다.
<?php
$price = 19.999999999999998;
echo ceil($price); // 산출结果是 20,기대를 충족시킵니다
$price2 = 19.999999999999996;
echo ceil($price2); // 산출结果是 20,기대를 충족시킵니다
$price3 = 19.999999999999994;
echo ceil($price3); // 也可能산출 20,부동 소수점 번호의 약간의 오류는 결과를 불안정하게 만듭니다.
?>
대량의 컴퓨팅 또는 금융 시스템에서 이러한 오류는 비즈니스 로직 오류로 이어질 수 있습니다.
PHP는 부동 소수점 오류를 피하기 위해 고정밀 수학 계산을위한 BCMATH 확장을 제공합니다.
<?php
$num = "19.999999999999998";
$result = bcadd($num, '0', 0); // 예약하다0십진수,아래쪽으로 반올림하는 것과 같습니다
if (bccomp($num, $result, 14) > 0) {
$result = bcadd($result, '1', 0); // 만약에$num결과보다 큽니다,그런 다음 위로 추가하십시오1,시뮬레이션ceil효과
}
echo $result; // 산출 20
?>
부동 소수점 번호에 특정 소수점을 반올림하면 부동 소수점 오류의 영향을 줄일 수 있습니다.
<?php
$num = 19.999999999999998;
$num = round($num, 10); // 예약하다10십진수
echo ceil($num);
?>
플로팅 포인트 숫자를 직접 계산할 때 오류를 피하기 위해 숫자를 문자열로 변환하고 논리를 사용자 정의하십시오.
금융 및 계측 시스템은 부동 소수점 번호를 피하고 모든 금액 (예 : 세그먼트와 같은 세그먼트)에 모든 금액을 저장하는 것이 좋습니다. 처리 후 필요한 장치로 돌아갑니다.
Ceil () 함수 자체는 오류가 발생하지 않지만 부동 소수점 번호의 정확성으로 인해 반올림 결과가 기대치에 맞지 않을 수 있습니다.
컴퓨터에서 부동 소수점 수의 대략적인 저장 문제는 근본 원인입니다.
BCMath 확장을 사용하거나 먼저 반올림하여 정확도 예외를 줄일 수 있습니다.
중요한 경우에는 플로팅 포인트 번호를 사용하지 않고 고정화 작업에 정수 또는 문자열을 사용하는 것이 좋습니다.