1

microtime()을 사용하여 하나의 변수에서 초와 마이크로 초를 가져 오려고합니다. 나는이 할 경우마이크로 초로 PHP 마이크로 타임() 변환

$initial_time = microtime(); 
echo (explode(' ', $initial_time)[1]) . "\n"; 
echo (explode(' ', $initial_time)[0]) . "\n"; 
echo (explode(' ', $initial_time)[1]) + (explode(' ', $initial_time)[0]) . "\n"; 

를 내가 얻을 : 나는 microtime (get_as_float) 또는 microtime (true)를 호출 한 것처럼

1419714319 
0.05059700 
1419714319.0506 

마지막 줄은 동일합니다;

1419714319.0506 대신 전체 결과 1419714319.05059700을 어떻게 얻을 수 있습니까?

감사합니다.

답변

3

부동 소수점 숫자로 표시되는 은 PHP.ini 파일의 precision 설정에 의해 제어됩니다. 기본값은 14이며,이 정확히 아래 참조 자리의 수 :

1419714319.0506 // 10 digits before, 4 after decimal, 14 total 

변경 많은 수의 ::이 숫자 만 의 수를 제어하는 ​​

ini_set("precision", 20); 
$t = microtime(true); 
var_dump($t); 
// float(1419716734.0712089539) 

참고이 설정으로 표시되지만 계산에 영향을주지 않습니다.

모든 것을, 당신은 여전히 ​​소수 자리수의 X 번호를 표시 할 수 서식 기능을 사용할 수 있습니다 말해 두 겠는데 :

$t1 = microtime(true); 
echo sprintf("%.20f", $t1);   // 1419717225.92410898208618164062 
echo number_format($t1, 20, ".", ""); // 1419717225.92410898208618164062 
1

이 모두를 얻을 나는 이것이 당신이 필요한 것입니다 바랍니다.

function microtime_float() 
{ 
    list($usec, $sec) = explode(" ", microtime()); 
    echo (float)$sec.''.substr((float)$usec, 1);; 
} 
1

지정한대로 정확히, 당신은 아마 할 수 없습니다 (신뢰성, 즉); 부동 소수점 값은 반드시 표현할 수있는 것은 아닙니다.

부동 소수점의 내부 표현은 모든 자릿수를 갖지만 기본적으로 고정 된 자릿수로 표시됩니다.

당신이 sprintf을 사용 도착할 수있는 가까운 :

$a = 1419714319.05059700; 
print "$a\n"; 
print sprintf("%.8f\n", $a); 

출력됩니다

1419714319.0506 
1419714319.05059695 

당신이 볼 수있는 작은 오류가있을 것입니다. 의 "실제"값을 보유 않습니다

$not_a_float = implode('.', explode(' 0.', microtime())); 

$not_a_float 것을 : 물론 또 다른 가능성은 별도로 저장하고 스케일링의 종류의 하나 백만 가능성을 사전에 곱하는을 정수 부분과 소수 부분을 처리하는 것입니다 microtime()이지만 문자열으로 표시됩니다. 해당 값에 대해 부동 소수점 연산을 수행하자마자 은 부동 소수점 정밀도으로 되돌아 가고 표현의 부정확성은 뒤로 물결 치게됩니다.

두 부분을 별도로 처리 할 수 ​​있습니다. 시간 차이를 먼저 한 후, 정수 부분 사이의 차이를 계산 두 번째 소수 부분을 추가 한 후 첫 번째 빼기 :

((($after[0]-$before[0])+$after[1])-$before[1]) 

괄호는 최소로 inaccuracy을 유지하기 위해 보장합니다. 그렇더라도 타이밍 이후에는 모든 처리를 가능하게 유지해야하므로 타이밍 자체에는 영향을주지 않습니다.

$before_raw = microtime(); 
... 
$after_raw = microtime(); 
$after = explode(' ', $after_raw); 
$before = explode(' ', $before_raw); 
$diff = ((($after[0]-$before[0])+$after[1])-$before[1]);