PHP의 부동 소수점 숫자 문제에 대해 토론하세요.

PHPz
풀어 주다: 2023-03-21 15:38:01
원래의
1541명이 탐색했습니다.

PHP는 널리 사용되는 프로그래밍 언어이자 서버측 스크립팅 언어입니다. PHP에서는 유연하고 강력한 기능을 가지고 있어 웹 개발 분야에서 널리 사용되고 있습니다.

PHP 프로그래밍에서 부동 소수점 숫자 계산을 자주 접하게 됩니다. 그러나 부동 소수점 숫자의 소수점 이하 숫자는 정확하게 표현하기 어렵기 때문에 두 부동 소수점 숫자가 같은지 비교할 때 종종 잘못된 결과가 발생합니다. . 결과.

PHP에서 부동 소수점 숫자 문제에 대해 논의해 보겠습니다.

부동소수점 숫자의 특징

부동소수점 숫자는 소수를 나타내는 데 사용되는 숫자로 가수와 지수라는 두 가지 요소가 있습니다. IEEE 754 표준에서 부동 소수점 숫자는 이진수로 표시됩니다.

값의 크기가 변함에 따라 부동 소수점 숫자의 정밀도도 달라지기 때문에 비교 연산을 수행할 때 부동 소수점 숫자의 특성에 주의해야 합니다.

예:

$a = 0.1 + 0.2;
$b = 0.3;
echo ($a == $b) ? "Equal" : "Not Equal";
로그인 후 복사

출력 결과가 동일할 것으로 예상합니다. 그러나 실제 출력 결과는 같지 않습니다.

이게 왜죠? 컴퓨터에서는 부동 소수점 숫자가 이진수 형태로 저장되기 때문에 0.1과 0.2는 이진수로 변환하면 무한히 반복되는 소수가 되고, 컴퓨터는 이를 저장할 수 있는 제한된 수의 자릿수만 사용할 수 있기 때문입니다. 따라서 컴퓨터가 0.1과 0.2를 바이너리로 변환할 때 정확히 정확하게 저장되지 않고 최종 결과도 약간씩 차이가 납니다. 이 편차는 추가 작업 중에 누적되어 결과가 예상 값과 같지 않게 됩니다.

부동 소수점 숫자를 비교하는 올바른 방법

PHP에는 두 부동 소수점 숫자가 같은지 비교하는 여러 가지 방법이 있습니다. 아래에서 그 방법들을 소개하겠습니다.

방법 1: round() 함수를 사용하여 오류를 확인합니다.

round() 함수는 부동 소수점 숫자를 지정된 자릿수로 반올림할 수 있습니다. 따라서 두 개의 부동 소수점 숫자가 같은지 비교하려면 먼저 round() 함수를 사용하여 동일한 소수 자릿수로 반올림한 다음 비교할 수 있습니다.

예:

$a = 0.1 + 0.2;
$b = 0.3;
$precision = 14;
if (round($a, $precision) == round($b, $precision)) {
  echo "Equal";
} else {
  echo "Not Equal";
}
로그인 후 복사

위의 예에서 $precision 변수는 반올림할 소수 자릿수를 지정합니다. 이 예에서는 round() 함수를 사용하여 두 숫자를 소수점 이하 14자리로 반올림한 다음 비교하여 올바른 결과를 얻습니다.

방법 2: 정확한 계산 라이브러리 사용

정확한 부동 소수점 비교를 수행해야 할 경우 PHP에서 제공하는 정확한 계산 라이브러리를 사용할 수 있습니다. 이 라이브러리는 부동 소수점 숫자에 대한 고정밀 계산을 수행하여 부동 소수점 연산에서 발생하는 오류를 방지할 수 있는 일부 기능을 제공합니다.

일반적으로 사용되는 정확한 계산 라이브러리에는 BC Math 및 GMP 라이브러리가 포함됩니다. 두 라이브러리 모두 다양한 고정밀 부동 소수점 연산을 수행할 수 있는 일련의 함수를 제공하며 계산 결과는 실제 결과와 동일합니다.

예:

$a = "0.1";
$b = "0.2";
$c = "0.3";
$sum = bcadd($a, $b, 2); // 计算a和b的和
if (bccomp($sum, $c, 2) == 0) { // 比较计算结果和期望结果
  echo "Equal";
} else {
  echo "Not Equal";
}
로그인 후 복사

위의 예에서는 bcadd() 함수를 사용하여 $sum 변수의 값을 계산한 다음 bccomp() 함수를 사용하여 $sum과 $의 값이 일치하는지 비교합니다. c는 동일합니다. bccomp() 함수는 같음의 경우 0, $sum이 $c보다 큰 경우 1, $sum이 $c보다 작은 경우 -1을 반환합니다.

결론

부동소수점 수의 특성으로 인해 부동소수점 수의 동등성을 비교할 때 계산 오류에 주의해야 합니다. 단순히 "=="를 사용하여 비교할 수는 없으며 다른 비교 방법을 사용해야 합니다. 반올림 및 정확한 계산 등을 기다리십시오. 올바른 비교 방법을 터득해야만 PHP에서 부동 소수점 연산을 올바르게 처리할 수 있습니다.

위 내용은 PHP의 부동 소수점 숫자 문제에 대해 토론하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿