부동 소수점 유형(부동 소수점 숫자 float, 배정밀도 숫자 double 또는 실수 실수라고도 함)은 다음 구문 중 하나로 정의할 수 있습니다.
<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?>
부동 소수점 숫자 형식으로 표현됩니다. :
LNUM [0-9]+
DNUM ([0-9]*[.]{LNUM}) ({LNUM}[.][0-9]*)
EXPONENT_DNUM [+-]?( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})
부동 소수점 숫자의 단어 길이는 플랫폼에 따라 다르지만 일반적인 최대값은 14자리 십진수 정밀도(64비트 IEEE 형식)를 포함하는 1.8e308입니다.
경고
부동소수점 숫자의 정밀도
부동소수점 숫자의 정밀도에는 제한이 있습니다. 시스템에 따라 다르지만 PHP는 일반적으로 IEEE 754 이중 형식을 사용하므로 반올림으로 인한 최대 상대 오차는 1.11e-16입니다. 기본이 아닌 수학 연산은 더 큰 오류를 초래할 수 있으므로 복합 연산을 수행할 때 오류 전파를 고려해야 합니다.
게다가 0.1이나 0.7과 같이 십진수로 정확하게 표현할 수 있는 유리수는 가수가 아무리 많아도 내부에서 사용하는 이진수로는 정확하게 표현할 수 없기 때문에 손실 없이 이진수로 변환할 수 없습니다. 약간의 정밀도. 이는 혼란스러운 결과를 초래할 수 있습니다. 예를 들어, 바닥((0.1+0.7)*10)은 일반적으로 예상되는 8 대신 7을 반환합니다. 왜냐하면 결과의 내부 표현은 실제로 7.999999999999991118... 과 같기 때문입니다.
따라서 부동 소수점 숫자 결과가 마지막 자리까지 정확하다고 절대 신뢰하지 말고, 두 부동 소수점 숫자가 같은지 비교하지 마세요. 정말로 더 높은 정밀도가 필요한 경우 임의 정밀도 수학 함수나 gmp 함수를 사용해야 합니다.
간단한 설명은 » 부동 소수점 가이드 웹페이지를 참조하세요.
부동 소수점 숫자로 변환
문자열을 부동 소수점 숫자로 변환하는 시기와 방법에 대한 정보를 보려면 "문자열을 숫자 값으로 변환" 섹션을 참조하세요. 다른 유형의 값의 경우 상황은 값을 정수로 변환한 다음 부동 소수점으로 변환하는 것과 유사합니다. 자세한 내용은 "정수로 변환" 섹션을 참조하세요. PHP 5부터 객체를 부동 소수점 숫자로 변환하려고 하면 E_NOTICE 오류 메시지가 표시됩니다.
부동소수점 비교
위의 경고 메시지와 같이 내부 표현상의 이유로 두 부동소수점 수를 동등하게 비교하는 데 문제가 있습니다. 그러나 부동 소수점 값을 비교하는 우회 방법이 있습니다.
부동 소수점 숫자가 같은지 테스트하려면 이 값보다 1포인트만 큰 최소 오류 값을 사용하세요. 기계 엡실론 또는 최소 단위 정수라고도 하는 이 값은 계산에 허용될 수 있는 가장 작은 차이 값입니다.
$a 및 $b의 정밀도는 소수점 이하 5자리와 같습니다.
<?php $a = 1.23456789; $b = 1.23456780; $epsilon = 0.00001; if(abs($a-$b) < $epsilon) { echo "true"; } ?>
NaN
특정 수학 연산은 상수 NAN으로 표시되는 결과를 생성합니다. 이 결과는 부동 소수점 연산에서 정의되지 않았거나 표현할 수 없는 값을 나타냅니다. 이 값을 다른 값과 느슨하게 또는 엄격하게 비교한 결과는 FALSE입니다.
NAN은 서로 다른 값을 나타내므로 NAN을 자신을 포함한 다른 값과 비교해서는 안 되며 is_nan()을 사용하여 확인해야 합니다.