PHP에서 부동 소수점 수의 비교는 항상 어려운 문제였습니다. 부동 소수점 숫자의 정확도 제한으로 인해 == 또는 ===를 사용하여 플로팅 포인트 수를 비교하면 부정확 한 결과가 발생할 수 있습니다. 따라서 많은 PHP 개발자는 bccomp () 함수를 사용하여 부동 소수점 비교를 수행하는 것이 좋습니다. 이 기사는 플로팅 포인트 번호를 비교하기 위해 == 또는 === 대신 bccomp ()를 사용하는 것이 권장되는 이유를 자세히 분석합니다.
부동 소수점 번호는 일반적으로 실수를 나타내는 데 사용되며 일반적으로 IEEE 754 표준으로 표시됩니다. 부동 소수점 숫자는 대략 유한 숫자를 가진 이진수로 표시되므로 종종 특정 소수점 숫자를 정확하게 나타내지 못합니다. 예를 들어, 컴퓨터에서 0.1을 0.1 로 정확하게 표현할 수 없으며 실제로 0.1 에 가까운 숫자 이며이 정확도 오류는 계산에 점차 축적 될 수 있습니다.
플로팅 지점 숫자를 비교하기 위해 == 또는 ===를 사용하는 경우, 두 플로팅 포인트 숫자 사이에 정확도가 약간 차이가 있으면 비교 결과가 예상보다 나빠질 수 있습니다. 예를 들어:
<span><span><span class="hljs-variable">$a</span></span><span> = </span><span><span class="hljs-number">0.1</span></span><span> + </span><span><span class="hljs-number">0.2</span></span><span>;
</span><span><span class="hljs-variable">$b</span></span><span> = </span><span><span class="hljs-number">0.3</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span> == </span><span><span class="hljs-variable">$b</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"동일한"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"不동일한"</span></span><span>;
}
</span></span>위의 코드는 컴퓨터에서 0.1 + 0.2가 컴퓨터에서 0.3 과 정확히 같지 않기 때문에 일부 환경에서 "동일하지 않은"출력이 될 수 있습니다.
bccomp () 는 PHP의 함수로, 플로팅 포인트 수를 임의의 정밀도와 비교하는 데 특별히 사용됩니다. 정상 == 및 === , bccomp () 는 부동 소수점 번호를 나타내는 문자열과 비교되며 비교의 정확도를 지정할 수 있습니다.
bccomp () 함수의 구문은 다음과 같습니다.
<span><span><span class="hljs-title function_ invoke__">bccomp</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$left_operand</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$right_operand</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$scale</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>): </span><span><span class="hljs-keyword">int</span></span><span>
</span></span>$ left_operand 및 $ right_operand 는 비교할 두 개의 부동 소수점 번호이며 문자열로 전달되어야합니다.
$ 스케일 매개 변수는 소수점 이후 최대 숫자, 즉 비교 중에 유지되는 정확도를 지정합니다.
bccomp () 함수는 정수 값을 반환합니다.
첫 번째 매개 변수가 두 번째 매개 변수보다 크면 return 1;
두 매개 변수가 동일하면 반환 0;
첫 번째 매개 변수가 두 번째 매개 변수보다 작은 경우 -1을 반환하십시오.
bccomp ()를 사용하면 컴퓨터 부동 소수점 표현 오류의 영향을받지 않고 부동 소수점 비교의 정확도가 예상 범위 내에서 제어되도록 할 수 있습니다.
bccomp ()를 사용하여 부동 소수점 숫자를 비교하려면 부동 소수점 번호를 문자열 형식으로 변환하고 적절한 정밀도를 설정해야합니다. 예를 들어:
<span><span><span class="hljs-variable">$a</span></span><span> = </span><span><span class="hljs-number">0.1</span></span><span> + </span><span><span class="hljs-number">0.2</span></span><span>;
</span><span><span class="hljs-variable">$b</span></span><span> = </span><span><span class="hljs-number">0.3</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">bccomp</span></span><span>((</span><span><span class="hljs-keyword">string</span></span><span>)</span><span><span class="hljs-variable">$a</span></span><span>, (</span><span><span class="hljs-keyword">string</span></span><span>)</span><span><span class="hljs-variable">$b</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>) == </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"동일한"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"不동일한"</span></span><span>;
}
</span></span>이 예에서는 부동 소수점 번호 $ a 와 $ b를 문자열로 변환하고 정밀도를 10 비트로 설정합니다. 이것은 부정확 한 부동 소수점 표현으로 인해 잘못된 비교를 피할 수 있습니다.
bccomp ()를 사용하면 $ 스케일 매개 변수를 통해 비교의 정확도를 지정할 수 있습니다. 이것은 금융, 과학 컴퓨팅 및 기타 분야와 관련된 부동 소수점 번호에 특히 중요합니다. 이 분야에서는 부동 소수점 수의 정확도가 높기 때문에 정확한 비교가 중요합니다.
예를 들어, 금융 응용 프로그램에서 가격 및 금액과 같은 부동 값에는 소수점 이후 여러 자리가 포함될 수 있습니다. 정확도가 제어되지 않으면 몇 센트를 계산하거나 논리적 오류를 유발하는 것과 같은 미묘한 오류가 발생할 수 있습니다.
<span><span><span class="hljs-variable">$price1</span></span><span> = </span><span><span class="hljs-string">"10.005"</span></span><span>;
</span><span><span class="hljs-variable">$price2</span></span><span> = </span><span><span class="hljs-string">"10.00499"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">bccomp</span></span><span>(</span><span><span class="hljs-variable">$price1</span></span><span>, </span><span><span class="hljs-variable">$price2</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>) == </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"价格동일한"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"价格不동일한"</span></span><span>;
}
</span></span>이 예에서 정확도를 4로 설정하면 가격 비교를 수행 할 때 정확도 문제로 인한 오류가 없는지 확인할 수 있습니다.
== 및 === 는 PHP에서 매우 일반적이지만 부동 소수점 비교에는 적합하지 않습니다. 구체적인 이유는 다음과 같습니다.
== : 두 피연산자는 비교 중에 유형으로 변환되어 바람직하지 않은 결과로 이어질 수 있습니다. 플로팅 점수를 비교할 때 ==는 정확도 문제를 무시하고 두 값이 동일한지 여부에 대해서만 관심이 있지만이 비교는 부동 소수점 수의 표현 오류로 인해 오류로 이어질 수 있습니다.
=== : == 유형 변환은 수행되지 않지만 두 개의 부동 소수점 숫자는 동일한 값뿐만 아니라 정확히 동일한 유형과 표현을가 필요합니다. 부동 소수점 번호의 정확도 오류로 인해 두 값이 매우 가까운 경우에도 ===가 False를 반환 할 수 있습니다.
예를 들어:
<span><span><span class="hljs-variable">$a</span></span><span> = </span><span><span class="hljs-number">0.1</span></span><span> + </span><span><span class="hljs-number">0.2</span></span><span>;
</span><span><span class="hljs-variable">$b</span></span><span> = </span><span><span class="hljs-number">0.3</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span> == </span><span><span class="hljs-variable">$b</span></span><span>); </span><span><span class="hljs-comment">// false</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span> === </span><span><span class="hljs-variable">$b</span></span><span>); </span><span><span class="hljs-comment">// false</span></span><span>
</span></span>플로팅 포인트 숫자를 비교하기 위해 == 또는 ===를 사용하는 부동 소수점 정확도 오류가 존재하기 때문입니다. 항상 신뢰할 수있는 것은 아닙니다.
부동 소수점 숫자의 정확도 제한으로 인해 == 또는 ===를 사용하여 부동 소수점 숫자를 직접 비교하면 부정확 한 결과가 발생할 수 있습니다. 이 문제를 해결하기 위해 BCComp () 함수를 사용하는 것이 좋습니다.이 기능은 플로팅 포인트 숫자를 비교하는보다 정확한 방법을 제공하고 개발자가 부동 소수점 수의 부정확 한 표현으로 인한 잠재적 오류를 피하고 비교의 정확도를 제어 할 수 있도록하는 것이 좋습니다. 고정밀 비교와 관련된 시나리오에서 BCComp ()는 보다 신뢰할 수 있고 안전한 선택입니다.