php 부동 소수점 뺄셈은 0과 다릅니다
php 부동 소수점 숫자를 이진수로 변환할 때 컴퓨터가 정밀도를 잃기 때문에 점 빼기는 0이 아닙니다. 따라서 bcadd() 함수를 사용하여 부동 소수점 숫자를 더하고 빼며 정밀도 변환을 수행할 수 있습니다.
또한 부동 소수점 수가 0인지 확인하려면 $num == 0을 사용하지 말고 abs($d) < EPS을 사용하세요. 이 EPS는 매우 작은 값입니다.
부동소수점 데이터로서 일부 정확도가 손실되어 완전히 정확할 수는 없습니다. 따라서 부동 소수점 숫자 결과가 마지막 숫자까지 정확하다고 절대 신뢰하지 말고 두 개의 부동 소수점 숫자가 같은지 비교하지 마십시오. 이는 PHP의 문제가 아니라 컴퓨터 내부 부동 소수점 숫자 처리의 문제라는 점에 유의해야 합니다! C, JAVA 등의 언어에서도 동일한 문제가 발생합니다.
부동 소수점 계산의 예는 다음과 같습니다.
$a = 0.2+0.7; $b = 0.9; var_dump($a == $b);
인쇄된 결과는 bool(false)입니다. 즉, 여기서 0.2+0.7의 계산 결과는 0.9와 같지 않으며 이는 분명히 우리의 상식에 어긋납니다.
이 문제와 관련하여 공식 PHP 매뉴얼에서는 다음과 같이 명시했습니다. 분명히 0.2와 같은 간단한 소수는 약간의 정밀도를 잃지 않고 내부 이진 형식으로 변환할 수 없습니다. 이는 특정 소수를 유한한 자릿수로 정확하게 표현하는 것이 불가능하다는 사실과 관련이 있습니다. 예를 들어, 10진수 1/3은 0.3333333...이 됩니다.
그래서 두 개의 부동 소수점 숫자를 비교하려면 비교하기 전에 필요한 정밀도 범위 내에서 제어해야 하므로 bcadd() 함수를 사용하여 부동 소수점 숫자를 추가하고 정밀도 변환(문자열로)을 수행합니다. ):
var_dump(bcadd(0.2,0.7,1) == 0.9); // 输出:bool(true)
더 많은 PHP 관련 지식을 보려면 PHP中文网을 방문하세요!
위 내용은 PHP 부동 소수점 빼기가 0이 아닙니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!