PHP에서 숫자 값을 처리 할 때, 특히 부동 소수점 번호를 계산할 때, 종종 정확도 편차 문제가 발생합니다. 이는 컴퓨터의 기본 레이어가 바이너리 플로팅 포인트 숫자를 사용하여 이진을 나타내며 일부 소수점 숫자를 바이너리로 정확하게 변환 할 수 없으므로 계산 프로세스 중에 오류가 발생하기 때문입니다.
PHP는 IEEE 754 표준을 따라 부동 소수점 번호를 나타냅니다. 부동 소수점 수치를 나타내며, 값을 부호 비트, 지수 (주문 코드) 및 상당한 숫자 (Mansidiaries)의 세 부분으로 나눕니다. 특정 소수 (0.1 또는 0.2와 같은)를 이진으로 변환 할 때, 무한 소수의 루프가 종종 발생하여 오류가 발생합니다.
$number = 0.1 + 0.2;
echo $number; // 산출 0.30000000000000004
위의 코드에서 0.1과 0.2의 합은 0.3이어야하지만 하단의 부동 소수점 숫자의 대략적인 표현으로 인해 출력 결과는 예상치 못한 오류가 있습니다.
$price = 1.0;
$quantity = 0.8;
$total = $price * $quantity;
echo $total; // 산출 0.80
결과는 출력에서 0.80이지만보다 복잡한 작업 또는 비교 작업에서 이러한 작은 오류는 논리적 판단 오류 또는 부정확 한 금액 계산으로 이어질 수 있습니다.
일반적인 속임수는 부동 소수점 번호를 정수로 변환하여 계산에 참여한 다음 원래 수치 값으로 복원하기위한 요구 사항에 따라 해당 배수로 나누는 것입니다. 이 방법은 재무 또는 측정 계산 단위에서 정확도 오류를 피하는 시나리오에 적합합니다.
$price = 10;
$quantity = 8;
$total = $price * $quantity / 10;
echo $total; // 산출 8.0
이 방법은 정수 곱셈을 위해 원래 0.8 및 1.0 ~ 10 및 8을 변환하여 플로팅 포인트 오류를 피하고 정확도를 복원하기 위해 10으로 나누어줍니다.
PHP의 내장 BCMATH 확장은 플로팅 포인트 수 정확도 문제를 해결하도록 설계되었습니다. 이를 통해 개발자는 문자열 모드에서 임의의 정밀도로 임의의 소수점 작업을 수행 할 수 있습니다.
echo bcadd('0.1', '0.2', 1); // 산출 0.3
BCMATH의 BCADD () 함수는 두 개의 숫자 문자열과 소수점 이하 자리를 예약하여 추가 작업을 정확하게 수행하여 부동 소수점 오류 문제를 완전히 피합니다.
실제 개발, 특히 금융, 재고 및 분수 계산과 같은 비즈니스 시나리오에서 복잡한 계산을 위해 PHP 기본 부동 소수점 번호를 사용하지 않는 것이 중요합니다. 정확도가 필요한 시나리오에서 BCMATH 확장을 사용하거나 정수 변환 전략을 사용하여 계산 프로세스 및 결과의 신뢰성을 보장하는 것이 좋습니다.