이 글에서는 참고값이 좋은 PHP 부동 소수점 수 비교 방법을 주로 소개합니다. 아래 편집기로 살펴보겠습니다
부동 소수점 연산의 정확성 문제
먼저 예를 살펴보세요:
<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($a+$b)==$c); var_dump(($c-$b)==$a); ?>
$a+$b==$c는 true를 반환합니다. , 맞습니다
$c- $b==$a가 false를 반환하고 오류
왜 이런 일이 발생하나요?
연산 후 정밀도가 20자리일 때 실제 반환되는 내용은 다음과 같습니다.
<?php $a = 0.1; $b = 0.9; $c = 1; printf("%.20f", $a+$b); // 1.00000000000000000000 printf("%.20f", $c-$b); // 0.09999999999999997780 ?>
$c-$b는 0.09999999999999997780이므로 0.1과 비교하면 false가 반환됩니다.
이 문제는 부동 소수점 계산에는 정밀도가 관련되어 있고 부동 소수점 숫자를 이진수로 변환하면 정밀도가 손실될 수 있기 때문입니다.
부동 소수점 변환 방법
정수 부분은 2로 나누어 나머지를 구합니다.method
소수 부분은2를 곱하여 반올림방법
예를 들어 : 숫자 8.5를 이진수로 변환
정수 부분은 8입니다.
8/2=4 8%2=0
4/2=2 4%2=0
2/2=1 2 %2=0
1 2보다 작으므로 계산할 필요가 없습니다. 정수 8의 이진법은 1000
소수 부분은 0.5
0.5x2 = 1.0입니다.
반올림 후의 소수 부분은 0이므로 더 이상 계산할 필요가 없습니다. 아래로 가세요
소수점 0.5의 이진수 표현은 0.1
8.5의 이진수 표현은 1000.1
계산하세요 숫자 0.9
0.9x2=1.8
0.8x2=1 .6
0.6x2=1.2
0.2x2 =0.4
0.4x2=0.8
0.8x2=1.6
… 차단 정확도가 N인 경우 N 이후의 숫자는 반올림되어 정확도가 떨어집니다.
위의 예에서는 바이너리로 변환하면 정밀도 0.9가 손실되어 비교 시 오류가 발생합니다.
그러므로 부동 소수점 숫자가 마지막 숫자까지 정확하다고 믿지 말고 두 부동 소수점 숫자가 같은지 비교하지 마세요.
부동소수점 숫자를 비교하는 올바른 방법
1. 라운드 방법을 사용하여 처리한 다음 비교
예:
<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($c-$b)==$a); // false var_dump(round(($c-$b),1)==round($a,1)); // true ?>
2. 높음을 사용하세요. -정밀 계산 방법
먼저 계산을 수행할 때 정확도가 떨어지지 않도록 고정밀 계산 방법을 사용하세요.
고정밀도 연산 방법은 다음과 같습니다.
bcadd 두 개의 고정밀도 숫자 추가
bccomp 두 개의 고정도 숫자를 비교하여 -1,0을 반환하고, 1
bcp 두 개의 고정밀 숫자 나누기
bcmod 고정밀 숫자의 나머지 구하기
bcmul 두 개의 고정밀 숫자 곱하기
bcpow 높이 탐색 정확도 디지털 곱셈기 pBCPOWMOD
고정밀 디지털 곱셈 모델 BCSCALE
구성 기본 소수점 찾기. 이는 Linux BC의 "scale =" bcsqrt
과 동일함 BC 숫자 제곱근 bcsub
두 개의 고정밀 숫자 빼기예:
<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($c-$b)==$a); // false var_dump(bcsub($c, $b, 1)==$a); // true ?>
위 내용은 PHP 부동 소수점 숫자 비교 방법에 대한 자세한 그래픽 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!