>  기사  >  백엔드 개발  >  PHP 부동 소수점 숫자 비교 방법에 대한 자세한 그래픽 설명

PHP 부동 소수점 숫자 비교 방법에 대한 자세한 그래픽 설명

墨辰丷
墨辰丷원래의
2018-05-22 16:34:231240검색

이 글에서는 참고값이 좋은 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
?>



관련 권장 사항:


JS

부동 소수점 숫자에 대한 자세한 설명

연산 처리(그래픽 및 텍스트) 튜토리얼)

javascript 구현을 통해
부동 소수점 수

의 제곱근을 구합니다. 자세한 설명

PHP에서 부정확한
부동 소수점 수

연산을 해결하는 예 공유



위 내용은 PHP 부동 소수점 숫자 비교 방법에 대한 자세한 그래픽 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.