PHP microtime()转换为微秒

时间:2014-12-27 21:30:34

标签: php floating-point numbers floating-point-precision microtime

我希望使用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

感谢。

3 个答案:

答案 0 :(得分: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 :(得分:1)

这两者都得到了,我希望这就是你所需要的。

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

答案 2 :(得分: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]);