1

microtime() を使用して、1 つの変数で秒とマイクロ秒を取得したいと考えています。私がこれを行う場合:

$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";

私は得る:

1419714319
0.05059700
1419714319.0506 

最後の行は、microtime(get_as_float) または microtime(true); を呼び出した場合と同じです。

1419714319.05059700代わりに完全な結果を取得するにはどうすればよい1419714319.0506ですか?

ありがとう。

4

3 に答える 3

3

浮動小数点数で表示される桁数は、PHP.ini ファイルの精度設定によって制御されます。デフォルト値は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
于 2014-12-27T21:33:29.963 に答える
1

あなたが指定したとおり、おそらくできません(確かにそうです)浮動小数点値は必ずしも表現可能ではありません。

浮動小数点の内部表現にはすべての小数が含まれますが、デフォルトでは固定桁数で表示されます。

到着できる最も近いのは、次を使用することですsprintf

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

出力します

1419714319.0506
1419714319.05059695

ご覧のとおり、小さなエラーが発生します。もちろん、別の可能性として、整数部分と小数部分を別々に格納して処理し、スケーリングの一種として 100 万倍にすることもできます。

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

$not_a_floatは の「実際の」値を保持しますが、文字列microtime()として保持することに注意してください。その値に対して浮動小数点演算を実行するとすぐに、浮動小数点の精度に戻り、表現の不正確さが徐々に戻ってきます。

2 つの部分を別々に処理できます。時差の場合、最初に整数部分の差を計算し、次に 2 番目の小数部分を追加してから、最初の部分を引きます。

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

括弧は、不正確さを最小限に抑えることを保証します。それでも、タイミング自体に影響を与えないように、タイミング後にすべての処理を可能な限り維持してください。

$before_raw = microtime();
...
$after_raw = microtime();
$after = explode(' ', $after_raw);
$before = explode(' ', $before_raw);
$diff = ((($after[0]-$before[0])+$after[1])-$before[1]);
于 2014-12-27T21:50:10.547 に答える
1

これは両方を取得します。これがあなたが必要としていたものであることを願っています.

function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    echo (float)$sec.''.substr((float)$usec, 1);;
}
于 2014-12-27T21:37:36.363 に答える