현재 위치: > 최신 기사 목록> PHP 플로팅 포인트 번호 정확도 오류 및 솔루션의 심층 분석

PHP 플로팅 포인트 번호 정확도 오류 및 솔루션의 심층 분석

gitbox 2025-06-23

1. PHP 부동 소수점 번호 정확도 문제의 개요

PHP에서 숫자 값을 처리 할 때, 특히 부동 소수점 번호를 계산할 때, 종종 정확도 편차 문제가 발생합니다. 이는 컴퓨터의 기본 레이어가 바이너리 플로팅 포인트 숫자를 사용하여 이진을 나타내며 일부 소수점 숫자를 바이너리로 정확하게 변환 할 수 없으므로 계산 프로세스 중에 오류가 발생하기 때문입니다.

2. 부동 소수점 오류의 근본 원인

2.1 IEEE 754 플로팅 포인트 번호 표현

PHP는 IEEE 754 표준을 따라 부동 소수점 번호를 나타냅니다. 부동 소수점 수치를 나타내며, 값을 부호 비트, 지수 (주문 코드) 및 상당한 숫자 (Mansidiaries)의 세 부분으로 나눕니다. 특정 소수 (0.1 또는 0.2와 같은)를 이진으로 변환 할 때, 무한 소수의 루프가 종종 발생하여 오류가 발생합니다.

 $number = 0.1 + 0.2;
echo $number;  // 산출 0.30000000000000004

위의 코드에서 0.1과 0.2의 합은 0.3이어야하지만 하단의 부동 소수점 숫자의 대략적인 표현으로 인해 출력 결과는 예상치 못한 오류가 있습니다.

2.2 정확도 편차의 예

 $price = 1.0;
$quantity = 0.8;
$total = $price * $quantity;
echo $total;  // 산출 0.80

결과는 출력에서 ​​0.80이지만보다 복잡한 작업 또는 비교 작업에서 이러한 작은 오류는 논리적 판단 오류 또는 부정확 한 금액 계산으로 이어질 수 있습니다.

3. 일반적인 솔루션

3.1 정수 작업을 사용하여 오류를 피하십시오

일반적인 속임수는 부동 소수점 번호를 정수로 변환하여 계산에 참여한 다음 원래 수치 값으로 복원하기위한 요구 사항에 따라 해당 배수로 나누는 것입니다. 이 방법은 재무 또는 측정 계산 단위에서 정확도 오류를 피하는 시나리오에 적합합니다.

 $price = 10;
$quantity = 8;
$total = $price * $quantity / 10;
echo $total;  // 산출 8.0

이 방법은 정수 곱셈을 위해 원래 0.8 및 1.0 ~ 10 및 8을 변환하여 플로팅 포인트 오류를 ​​피하고 정확도를 복원하기 위해 10으로 나누어줍니다.

3.2 BCMATH 고밀도 수학 라이브러리 사용

PHP의 내장 BCMATH 확장은 플로팅 포인트 수 정확도 문제를 해결하도록 설계되었습니다. 이를 통해 개발자는 문자열 모드에서 임의의 정밀도로 임의의 소수점 작업을 수행 할 수 있습니다.

 echo bcadd('0.1', '0.2', 1);  // 산출 0.3

BCMATH의 BCADD () 함수는 두 개의 숫자 문자열과 소수점 이하 자리를 예약하여 추가 작업을 정확하게 수행하여 부동 소수점 오류 문제를 완전히 피합니다.

4. 요약 및 실제 제안

실제 개발, 특히 금융, 재고 및 분수 계산과 같은 비즈니스 시나리오에서 복잡한 계산을 위해 PHP 기본 부동 소수점 번호를 사용하지 않는 것이 중요합니다. 정확도가 필요한 시나리오에서 BCMATH 확장을 사용하거나 정수 변환 전략을 사용하여 계산 프로세스 및 결과의 신뢰성을 보장하는 것이 좋습니다.