1

我想使用 microtime() 在一个变量中获得秒和微秒。如果我这样做:

$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

如您所见,会有一个小错误。当然,另一种可能性是分别存储和处理整数部分和小数部分,可能将其预乘一百万作为一种缩放:

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

请注意,它$not_a_float确实包含 的“真实”值microtime(),但它是作为字符串的。一旦您对该值执行任何浮点运算,它将恢复为浮点精度,并且表示不准确性将重新出现。

您可以分别处理这两个部分;对于时间差异,您首先计算整数部分之间的差异,然后添加第二个小数部分,然后减去第一个:

((($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 回答