PHP 부동 소수점 계산이 부정확한 이유는 무엇입니까?
PHP 프로그래밍에서는 부정확한 부동 소수점 계산 문제에 직면할 수 있습니다. 이 문제의 원인과 해결 방법을 이해하면 코드의 신뢰성과 정확성을 향상시킬 수 있습니다.
1. 문제의 원인
부동소수점 숫자는 부동소수점 숫자를 표현하는 매우 편리한 방법이지만 몇 가지 단점도 있습니다. 주된 이유는 컴퓨터가 이진수를 사용하여 숫자를 저장하고 모든 부동 소수점 숫자를 정확하게 표현할 수 없기 때문입니다. 이로 인해 반올림 오류가 발생하고 정밀도가 손실됩니다.
예를 들어 간단한 부동 소수점 계산을 상상해 보세요.
0.1 + 0.2 = 0.3
PHP에서 이 코드의 결과는 다음과 같습니다.
echo 0.1 + 0.2; //0.30000000000000004
분명히 이 결과는 우리가 예상한 결과가 아닙니다. 0.1과 0.2는 이진수로 정확하게 표현할 수 없어 반올림 오류가 발생하기 때문입니다. 이 오류는 일반적으로 작지만 정확도가 떨어지거나 일부 고정밀 계산에서 오류가 발생하는 데 충분합니다.
2. 솔루션
부정확한 부동 소수점 계산 문제에 대해 다음 솔루션을 채택할 수 있습니다.
- 정수 계산 사용
정확한 계산을 수행할 때 먼저 부동 소수점 숫자를 정수로 변환한 다음 계산할 수 있습니다. . 계산이 완료된 후 결과는 다시 부동 소수점 숫자로 변환됩니다.
예를 들어 다음 부동 소수점 계산을 고려해보세요.
1.23 + 4.56 = 5.79
부동 소수점 숫자는 계산을 위해 정수로 변환될 수 있습니다.
$num1 = 123; $num2 = 456; $result = ($num1 + $num2) / 100; // 5.79
- BCMath 사용
PHP는 임의의 정밀도 숫자를 정확하게 계산하는 데 사용할 수 있는 BCMath 확장을 제공합니다. . 부동 소수점 계산은 부동 소수점 숫자 대신 문자열을 사용하여 숫자를 나타내는 BCMath 라이브러리를 사용하여 수행할 수 있습니다.
예를 들어 BCMath 함수 라이브러리를 사용하여 다음을 계산합니다.
$val1 = '0.1'; $val2 = '0.2'; echo bcadd($val1, $val2, 1); // 0.3
이 예에서는 bcadd() 함수를 사용하여 정확한 부동 소수점 덧셈을 수행합니다.
- round() 함수를 사용하세요
어떤 경우에는 round() 함수를 사용하여 정밀도 오류를 줄일 수 있습니다. round() 함수는 부동 소수점 숫자를 지정된 소수 자릿수로 반올림합니다.
예를 들어 다음 계산을 고려해 보세요.
$num1 = 0.1; $num2 = 0.2; $result = round($num1 + $num2, 1); // 0.3
이 예에서는 round() 함수를 사용하여 결과를 소수점 이하 한 자리로 반올림합니다. 이것이 정확도 오류를 완전히 제거하지는 못하지만 결과는 예상 결과에 훨씬 더 가깝습니다.
- 부동 소수점 숫자를 직접 비교하지 마세요
부동 소수점 숫자를 비교할 때 일부 내결함성 메커니즘을 사용해야 합니다. 부동 소수점 숫자의 정밀도는 반올림 오류로 인해 어려움을 겪을 수 있으므로 일반적으로 두 부동 소수점 숫자의 값을 직접 비교하는 것은 신뢰할 수 없습니다.
예를 들어 다음 부동 소수점 비교를 고려해 보세요.
$val1 = 3.14159265; $val2 = 3.14159267; if ($val1 == $val2) { echo 'val1 等于 val2'; } else { echo 'val1 不等于 val2'; }
이 예에서는 두 개의 부동 소수점 숫자를 비교합니다. 이 두 숫자는 가깝지만 동일하지는 않습니다. 따라서 코드는 "val1이 val2와 같지 않습니다"를 출력합니다.
두 개의 부동 소수점 숫자를 비교해야 하는 경우 허용오차 값이나 델타 값을 사용할 수 있습니다. 공차 값은 부동 소수점 숫자의 작은 오류를 허용할 수 있는 작은 숫자입니다.
예를 들어 허용되는 최대 정밀도 오류를 나타내는 델타 값을 정의할 수 있습니다.
$delta = 0.00000001;
델타 값을 사용하면 다음 코드를 사용하여 부동 소수점 숫자를 비교할 수 있습니다.
$val1 = 3.14159265; $val2 = 3.14159267; if (abs($val1 - $val2) < $delta) { echo 'val1 等于 val2'; } else { echo 'val1 不等于 val2'; }
이 예에서는 abs() 함수 두 부동 소수점 숫자의 차이를 계산하고 델타 값과 비교합니다. 두 숫자의 차이가 델타 값보다 작으면 동일한 것으로 간주됩니다.
즉, 부정확한 부동 소수점 계산 문제는 일반적인 문제입니다. PHP에서는 정수 연산, BCMath 함수 라이브러리, round() 함수, 델타 값 허용 오차 등의 방법을 사용하여 이 문제를 해결할 수 있습니다. 상황에 따라 다양한 솔루션을 선택할 수 있습니다.
위 내용은 PHP 부동 소수점 계산이 부정확한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

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

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

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

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

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

뜨거운 주제











PHP 8의 JIT 컴파일은 자주 실행되는 코드를 컴퓨터 코드로 컴파일하여 성능을 향상시켜 계산이 많은 응용 프로그램에 도움이되고 실행 시간을 줄입니다.

이 기사는 코드 주입과 같은 취약점을 방지하기 위해 PHP 파일 업로드 보안에 대해 설명합니다. 파일 유형 유효성 검증, 보안 저장 및 오류 처리에 중점을 두어 응용 프로그램 보안을 향상시킵니다.

이 기사는 PHP 및 완화 전략의 OWASP Top 10 취약점에 대해 설명합니다. 주요 문제에는 PHP 응용 프로그램을 모니터링하고 보호하기위한 권장 도구가 포함 된 주입, 인증 파손 및 XSS가 포함됩니다.

이 기사는 PHP의 대칭 및 비대칭 암호화에 대해 논의하여 적합성, 성능 및 보안 차이를 비교합니다. 대칭 암호화는 더 빠르고 벌크 데이터에 적합하지만 안전한 키 교환에는 비대칭이 사용됩니다.

이 기사에서는 PHP에서 강력한 인증 및 승인을 구현하여 무단 액세스를 방지하고 모범 사례를 자세히 설명하고 보안 향상 도구를 권장합니다.

기사는 PHP, 커버 단계, 보안 측정, 최적화 기술 및 Solutions의 일반적인 오류를 사용하여 데이터베이스에서 데이터 검색에 대해 논의합니다. 문자 수 : 159

이 기사는 토큰 버킷 및 누출 된 버킷과 같은 알고리즘을 포함하여 PHP에서 API 요율 제한을 구현하고 Symfony/Rate-Limiter와 같은 라이브러리 사용 전략에 대해 설명합니다. 또한 모니터링, 동적 조정 요율 제한 및 손도 다룹니다.

이 기사는 CSRF 토큰, 동일한 사이트 쿠키 및 적절한 세션 관리를 포함하여 PHP의 CSRF 공격을 방지하는 전략에 대해 설명합니다.
