PHP에서 Array_Diff ()는 배열과 반환 차이를 비교하는 매우 실용적인 기능입니다. 값을 비교하여 첫 번째 배열에서는 요소를 찾지만 다른 배열에서는 그렇지 않습니다. 이것은 일반적으로 문자열과 정수의 처리에 문제가되지 않지만 부동 소수점 배열을 처리 할 때 부동 소수점 숫자로 인해 일부 "예상치 못한"동작이 발생할 수 있습니다.
간단한 예로 시작하겠습니다.
<?php
$a = [1.1, 2.2, 3.3];
$b = [2.2, 3.3];
$result = array_diff($a, $b);
print_r($result);
출력은 다음과 같습니다.
Array
(
[0] => 1.1
)
이 결과는 기대치와 일치합니다. 그러나 경우에 따라 플로팅 포인트 수는 정밀 제한으로 인해 Array_Diff () 와 비교하여 오류를 유발할 수 있습니다.
플로팅 포인트 숫자는 컴퓨터의 특정 소수성을 정확하게 나타낼 수 없으며 약간의 오류가있을 수 있습니다. 예를 들어:
<?php
$a = [0.1 + 0.2]; // 실제 가치는입니다 0.30000000000000004
$b = [0.3];
$result = array_diff($a, $b);
print_r($result);
출력은 다음과 같습니다.
Array
(
[0] => 0.30000000000000004
)
0.1 + 0.2 == 0.3 이라고 생각할 수도 있지만 컴퓨터 내부의 바이너리 플로팅 포인트 표현 이이 방정식이 항상 사실은 아닙니다. 이는 Array_Diff ()가 두 값을 동일하지 않은 것으로 간주하여 잘못 판단을 초래할 것임을 의미합니다.
array_diff () 의 기본 레이어는 느슨한 비교 ( == )를 기반으로하여 두 값이 동일인지 여부를 결정합니다. 그러나 부동 소수점 숫자 자체의 정확도 문제는 두 숫자가 논리적으로 "동일"하더라도 특히 소수점 계산이 관련된 후에 메모리 표현이 다를 수 있음을 의미합니다.
정밀한 계산이 필요한 재무 데이터, 센서 데이터 또는 기타 비즈니스 시나리오를 처리 할 때 Array_diff () 의 동작은 다음과 같습니다.
데이터가 존재하는지 여부를 잘못 식별합니다
비즈니스 판단 지점의 논리적 오류
데이터 차이를 올바르게 동기화하거나 비교할 수 없습니다
이것은 코드 버그 일뿐 만 아니라 비즈니스 보안 문제 일 수도 있습니다.
PHP는 array_udiff ()를 제공하여 개발자가 자체 비교 함수를 제공 할 수있게 해주 며 더 안전한 부동 소수점 차이 로직을 구현할 수 있습니다.
<?php
function float_compare($a, $b) {
$epsilon = 0.00001; // 정확도 공차
if (abs($a - $b) < $epsilon) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = [0.1 + 0.2];
$b = [0.3];
$result = array_udiff($a, $b, 'float_compare');
print_r($result);
출력은 다음과 같습니다.
Array
(
)
이번에는 array_udiff ()는 부동 소수점 오류로 인한 문제를 피하기 위해 두 사람이 "동일"임을 올바르게 식별합니다.
Array_udiff () 또는 사용자 정의 함수를 사용할 수없는 경우 "곡선을 저장"메소드가 부동 소수점 번호를 형식화하기 위해 다음과 같습니다.
$a = array_map(function($v) {
return round($v, 5);
}, [0.1 + 0.2]);
$b = array_map(function($v) {
return round($v, 5);
}, [0.3]);
$result = array_diff($a, $b);
print_r($result);
이 방법은 정확성으로 인한 대부분의 문제를 효과적으로 피할 수 있지만주의해서 사용해야합니다.
플로팅 포인트 배열을 처리하기 위해 Array_Diff ()를 사용하는 경우 플로팅 포인트 수, 특히 정확도 오류의 영향에 대한 PHP 처리 메커니즘에 특별한주의를 기울여야합니다. 부동 소수점 숫자가 직접 비교되면 논리적 오류와 보안 위험이 발생할 수 있습니다. 데이터 정확도를 보장하려면 사용자 정의 된 정확도 공차 비교 함수와 함께 Array_udiff ()를 사용하거나 데이터의 통합 형식을 수행하는 것이 좋습니다.
중요한 데이터와 관련된 비즈니스에서는 겉보기에 사소한 오류를 무시해서는 안됩니다.