여기에서 내가 한 일을 확신하는 데 끔찍한 시간을 보내고 있습니다. 나는 불쾌감을 특정 섹션은 다음과 같습니다 다시 BC 또는 GMP 라이브러리 (어느 것도 사용할 수 항상)에 가을 중 하나에 부동 소수점 정밀도를 유지하기 위해PHP에서 미세 시간 및 부동 소수점을 추가하는 숫자가 정확하지 않습니다.
return ((float)($now+$sec).'.'.$mic);
, 내가 강제하고있다. 이 경우 문자열 연결과 함께 숫자를 jamming하는 데 의존했습니다.
<?php
// return the current time, with microseconds
function tick() {
list($sec, $mic, $now) = sscanf(microtime(), "%d.%d %d");
return ((float)($now+$sec).'.'.$mic);
}
// compare the two given times and return the difference
function elapsed($start, $end) {
$diff = $end-$start;
// the difference was negligible
if($diff < 0.0001)
return 0.0;
return $diff;
}
// get our start time
$start = tick();
// sleep for 2 seconds (should be ever slightly more than '2' when measured)
sleep(2);
// get our end time
$end = tick();
$elapsed = elapsed($start, $end);
// should produce output similar to: float(2.00113797188)
var_dump($elapsed);
?>
나는 변함없이 123456789.099와 끝까지 더하기 연산자 (+)를 사용하여, 123456789 (타임 스탬프를 나타내는) 및 0.0987654321 (대표 마이크로)처럼 두 개의 번호를 추가하려고하면
. float에 정수를 캐스팅 할 때도 결과는 동일합니다.1) 해킹이 아니며 2) 문자열 연결이 필요하지 않은이 문제에 대한 해결책이 있습니까? 마이크로 초 해상도의 정확한 타임 스탬프를 얻기 위해 이런 종류의 코드가 엉망이되어서는 안됩니다.
편집 : S. Gehrig가 설명했듯이 PHP의 부동 소수점 숫자는 때때로 약간 까다로울 수 있습니다. PHP 구성에 표시된 "정밀도"는 표시에 관한 것입니다. 내가 생각한 것처럼 실제 값은 반올림되지 않습니다. 당신이 $가 또는 $ 다른에서 하나를 뺀 전에을 종료 시작 검토한다면,
// return the current time, with microseconds
function tick() {
return microtime(true);
}
// compare the two given times and return the difference
function elapsed($start, $end) {
return $end-$start;
}
// get our start time
$start = tick();
// sleep for 2 seconds (should be ever slightly more than '2' when measured)
sleep(2);
// get our end time
$end = tick();
$elapsed = elapsed($start, $end);
// should produce output similar to: float(2.00113797188)
var_dump($elapsed);
그들이 1/100로 반올림 된 나타날 수 있습니다 위의 코드에 대한 훨씬 간단 솔루션과 같이 보일 것이다 위치. 그렇지 않다. 디스플레이가 제한되어있는 동안 산술에 대해 임의의 정밀도가 유지되는 것으로 보입니다.
정확하지만 정밀도는 2 곳으로 반올림되며이를 변경하는 방법이없는 것 같습니다. 기본적으로 PHP의 정밀도는 12 개입니다. 그러나이 함수는이를 존중하지 않습니다. 다음과 같이 확인하십시오 : php -r 'echo microtime (true); 나는 그것이 무엇처럼 둥글게 만드는 지 전혀 모른다. – spligak
float의 소수 자릿수 12 자의 정밀도는 쉼표 앞에 소수점 이하자를 포함하므로 12 자릿수 정밀도는 사용자가 보는 것과 정확히 일치합니다. –
이것은 디스플레이 문제 일 뿐이며 'precision' 구성 설정에 의해 제어됩니다. http://us2.php.net/manual/en/ini.core.php#ini.precision. 내부적으로 float는 대략 십진수 14 자리의 정밀도를가집니다. –