정밀한 위험 : PHP의 부동 소수점 수를 처리합니다
PHP의 0.1 0.2! == 0.3 바이너리 플로팅 포인트 정밀 제한으로 인해 개발자는 직접 비교를 피하고 Epsilon 기반 검사를 사용하고, 정확한 산술에 BCMATH 또는 GMP를 사용하고, 가능하면 정수에 정수를 저장하고, 신중하게 출력하며, 금융 계산에 대한 플로트 정밀도에 의존하지 않아야합니다.
PHP, 특히 재무 또는 과학적 계산에서 숫자로 작업 할 때 개발자는 종종 부동 소수점 정밀도 로 인해 미묘하지만 심각한 문제를 해결합니다. PHP는 정수와 문자열을 예측할 수있게하지만 부동 소수점 산술은 언뜻보기에 0.1 0.2 !== 0.3
같은 결과를 생성 할 수 있습니다. 이것은 PHP의 버그가 아닙니다. 컴퓨터가 바이너리에서 소수점 숫자를 나타내는 결과입니다.

PHP의 부동 소수점 정밀도의 위험과 올바르게 처리하는 방법을 분류합시다.
부동 소수점 수학이 잘못되는 이유
PHP의 부동 소수점 수 (대부분의 프로그래밍 언어와 예 : 이진 표현의 IEEE 754 표준을 따릅니다. 많은 소수점 분획이 바이너리에서 정확하게 표현 될 수 없기 때문에 문제가 발생합니다.

예를 들어:
var_dump (0.1 0.2); // float (0.3000000000000000004) var_dump (0.1 0.2 == 0.3); // bool (false)
이것은 0.1
과 0.2
1/3
과 마찬가지로 0.333...
진수에서 이진에서 반복되는 분획이기 때문에 발생합니다. 유한 한 메모리 (더블의 경우 64 비트)에 저장되면 둥글게되어 작은 부정확성이 발생합니다.

이러한 반올림 오류는 축적되어 다음을 유발할 수 있습니다.
- 잘못된 비교
- 예상치 못한 계산이 발생합니다
- 금융 응용 프로그램의 버그 (예 : 잘못된 총계)
직접 평등 비교를 사용하지 마십시오
가장 일반적인 실수 중 하나는 부동 소수점 숫자를 ==
또는 ===
와 비교하는 것입니다.
// ❌ 위험합니다 if (0.1 0.2 == 0.3) { 에코 "동일"; // 이것은 실행되지 않습니다 }
대신, 공차 (Epsilon)를 사용하여 두 개의 플로트가 "충분히 가깝다"는지 확인하십시오.
// ✅ 안전한 비교 함수 float equessal ($ a, $ b, $ epsilon = 0.00001) { 복귀 복근 ($ a - $ b) <$ epsilon; } if (float equessal (0.1 0.2, 0.3)) { 에코 "효과적으로 동일"; // 이것은 실행됩니다 }
응용 프로그램의 필수 정밀도를 기반으로 $epsilon
선택하십시오. 돈의 경우 0.0001
이 종종 충분합니다.
정확한 산술을 위해 BCMATH 또는 GMP를 사용하십시오
정밀도가 재무 계산과 마찬가지로 정밀도가 중요한 경우, 부유 식 점수는 전적으로 숫자입니다. PHP는 임의의 정밀 산술에 대한 BCMATH 및 GMP 확장을 제공합니다.
BCMATH : 임의의 정밀 소수점 수학
BCMATH는 숫자와 함께 문자열로 작동하며 정확한 정밀도로 추가, 뺄셈, 곱셈, 분할 등을 지원합니다.
// 예 : 0.1 0.2 = 0.3, 정확히 $ result = bcadd ( '0.1', '0.2', 1); // '0.3'
참고 : 모든 피연산자는 문자열이어야하며 스케일 (소수점 수)을 지정합니다.
더 많은 예 :
Echo bcmul ( '0.1', '0.2', 2); // '0.02' echo bcdiv ( '1.0', '3.0', 5); // '0.33333'
bcmath는 다음에 이상적입니다.
- 통화 계산
- 세금,이자 또는 송장 총계
- 반올림 오류가 용납 할 수없는 상황
GMP : 정수 기반 고정밀 수학
GMP는 큰 정수의 경우 더 효율적이지만 값을 확장 할 수있을 때 가장 잘 작동합니다 (예 : 달러 대신 센트 센트).
$ mold1 = gmp_init (10); // 10 센트 $ 금액 2 = gmp_init (20); // 20 센트 $ total = gmp_add ($ polleg1, $ fumber2); // 30 센트 echo gmp_strval (총 $); // "30"
이것은 결제 시스템의 공동체를 완전히 피합니다.
서식 및 표시 문제
내부 계산이 정확하더라도 플로트 표시를 오도 할 수 있습니다.
에코 0.29 * 100; // 28.999999999999996을 표시 할 수 있습니다
출력을 제어하려면 number_format()
또는 printf()
사용하십시오.
echo number_format (0.29 * 100, 2); // "29.00"
그러나 기억 : 서식은 기본 값이 아니라 디스플레이에만 영향을 미칩니다.
모범 사례 요약
PHP의 떠 다니는 함정을 피하기 위해 :
- float를 직접 비교하지 마십시오 . Epsilon을 사용하십시오.
- financial 금융 또는 고정밀 소수점 수학에 BCMath를 사용하십시오 .
- ✅ 가능하면 통화를 센트 (정수)로 저장합니다 .
- ✅ 의도적으로 입력 값을 검증하고 둥글게합니다 .
- type 유형 저글링에 신중해야합니다. -PHP는 문자열을 자랑스럽게 플로트로 변환 할 수 있습니다.
안전한 돈 취급의 예 :
// bcmath를 사용하여 센트로 두 금액을 추가합니다 함수 addMoney ($ a, $ b) { 반환 bcadd ($ a, $ b, 0); // 센트의 소수점 자리가 없습니다 } $ totalcents = addMoney ( '150', '250'); // '400'센트 = $ 4.00
부동 소수점 숫자는 과학적 또는 대략적인 계산에 유용하지만 정확한 산술에 적합하지 않습니다. PHP에서 키는 기본 플로트 동작을 벗어나 BCMATH와 같은 도구를 사용하여 정확도를 보존 할시기를 알 수 있습니다.
기본적으로 : 정밀도가 중요한 경우, 소수점을 믿지 마십시오.
위 내용은 정밀한 위험 : PHP의 부동 소수점 수를 처리합니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP는 느슨한 유형과 엄격한 유형의 공존을 지원하는데, 이는 스크립팅 언어에서 최신 프로그래밍 언어로의 진화의 핵심 기능입니다. 1. 느슨한 유형은 빠른 프로토 타이핑, 동적 사용자 입력 처리 또는 외부 API로 도킹하는 데 적합하지만 암시 적 유형 변환 위험, 디버깅의 어려움 및 공구 지원이 약한 문제가 있습니다. 2. 엄격한 유형은 선언 (strict_types = 1)을 통해 활성화되며, 이는 사전에 오류를 감지하고 코드 가독성 및 IDE 지원을 개선 할 수 있으며 핵심 비즈니스 로직, 팀 협업 및 데이터 무결성에 대한 높은 요구 사항을 가진 시나리오에 적합합니다. 3. 실제 개발에 혼합 사용을 사용해야합니다. 엄격한 유형은 기본적으로 활성화되며, 입력 경계에서 필요한 경우에만 느슨한 유형이 사용되며 가능한 빨리 확인 및 유형 변환이 수행됩니다. 4. 권장 관행에는 PHPSTA 사용이 포함됩니다

upgradephp7.xcodebasestophp8 by-replacingphpdoc-suggestedtypes@paramstring | intwithnativeUniontypessuchasstring | intforparametersandreturntypes, 어떤 thatimprovestypeseafetyAndClarity;

0.1 0.2! == 0.3inphpduetobinaryfloating-pointprecisionlimitations, sodevelopersmustavoiddirecteccepisonsanduseepsilon 기반 체크, EmployBcMathorgMpforexActArithMetic, storecurrencyInintegerswhenpossible, formatoutputceRity, 및 NferrelyOnflelyOnflelyPrecision

returnTypesInphPimProveCoderELiabilityAndClarityBySpecifying whatAfunctionMustreturn.2.useBasicTypesLikestring, Array, OrdateTimetOenforceCorrecReturnValuesandcatchErrorsearly.3. ApplyNullAbleTyPesswitHe (예 :?

AcallableInphpisapseudo-typerepreepreperepresenting annyvaluethattcanbeinvokedusing the () 운영자, 사용 된 pricefforflexiblecodeincallsandhigher-orderfenctions; themainformsofcallablesare : 1) namedfunctions like'strlen ', 2) AnonymousFunctions (), 3), 3), 3), 3)

Php8.1에 도입 된 열거는 유형-안전 상수 컬렉션을 제공하여 마법 가치 문제를 해결합니다. 1. Enum을 사용하여 상태 :: draft와 같은 고정 상수를 정의하여 사전 정의 된 값 만 사용할 수 있도록합니다. 2. 뒷골목을 통해 현 또는 정수에 열거를 바인딩하고 스칼라와 열거 사이의 () 및 tryfrom ()의 변환을지지합니다. 3. 열거는 비즈니스 로직 캡슐화를 향상시키기 위해 Color () 및 isedible ()과 같은 방법과 동작을 정의 할 수 있습니다. 4. 동적 데이터가 아닌 상태 및 구성과 같은 정적 시나리오에 적용 가능; 5. 유형 제약 조건에 대한 Unitenum 또는 Backedenum 인터페이스를 구현하고 코드 견고성 및 IDE 지원을 개선 할 수 있으며

PHP는 ZVAL 구조를 사용하여 변수를 관리합니다. 대답은 다음과 같습니다. 1. ZVal에는 값, 유형 및 메타 데이터가 16 바이트 인 크기가 포함되어 있습니다. 2. 유형이 변경되면 노조 및 유형 정보 만 업데이트해야합니다. 3. 복잡한 유형은 포인터를 통한 참조 수의 구조를 나타냅니다. 4. 값을 할당 할 때 복사는 메모리를 최적화하는 데 사용됩니다. 5. 참조는 변수가 동일한 ZVal을 공유하게합니다. 6. 재활용 참조는 특수 쓰레기 수집가에 의해 처리됩니다. 이것은 PHP 변수 동작의 기본 메커니즘을 설명합니다.

PHP의 메모리 관리는 참조 계산 및 사이클 재활용을 기반으로합니다. 다양한 데이터 유형은 성능 및 메모리 소비에 중대한 영향을 미칩니다. 1. 정수 및 부동 소수점 숫자는 메모리 사용량이 적고 가장 빠른 작업을 가지고 있으며 먼저 수치 작업에 사용해야합니다. 2. 문자열은 쓰기 쓰기 복사 메커니즘을 채택하지만 큰 문자열 또는 빈번한 접합은 성능 문제를 일으킬 것이므로 Implode 최적화를 사용하는 것이 좋습니다. 3. 어레이 메모리 오버 헤드, 특히 크거나 중첩 된 배열이 크다. 발전기는 큰 데이터 세트를 처리하고 변수를 적시에 처리하는 데 사용해야합니다. 4. 객체는 참조 모드로 전달되며 인스턴스화 및 속성 액세스가 느리므로 행동 캡슐화가 필요한 시나리오에 적합합니다. 5. 리소스 유형은 수동으로 해제되어야합니다. 그렇지 않으면 시스템 수준 누출로 이어질 수 있습니다. 성능을 향상시키기 위해서는 데이터 유형을 합리적으로 선택하고 메모리를 제 시간에 해제해야하며 전역 변수로 큰 데이터를 피해야합니다.
