首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP microtime()转换为微秒

PHP microtime()转换为微秒
EN

Stack Overflow用户
提问于 2014-12-27 21:30:33
回答 3查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
$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";

我得到:

代码语言:javascript
复制
1419714319
0.05059700
1419714319.0506 

最后一行就像我会调用microtime(get_as_float)或microtime(True)一样;

我如何得到完整的结果1419714319.05059700而不是1419714319.0506

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-27 21:33:29

浮点数中显示的数字数由精密度文件中的PHP.ini设置控制。它的默认值是14,这正是您在下面看到的数字数:

代码语言:javascript
复制
1419714319.0506 // 10 digits before, 4 after decimal, 14 total

将此设置更改为更大的数字:

代码语言:javascript
复制
ini_set("precision", 20);
$t = microtime(true);
var_dump($t);
// float(1419716734.0712089539)

请注意,这仅控制显示的数字数,不影响计算。

尽管如此,您仍然可以使用数字格式函数在十进制之后显示x位数:

代码语言:javascript
复制
$t1 = microtime(true);
echo sprintf("%.20f", $t1);           // 1419717225.92410898208618164062
echo number_format($t1, 20, ".", ""); // 1419717225.92410898208618164062
票数 3
EN

Stack Overflow用户

发布于 2014-12-27 21:37:36

这两样都有,我希望这是你需要的。

代码语言:javascript
复制
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
    echo (float)$sec.''.substr((float)$usec, 1);;
}
票数 1
EN

Stack Overflow用户

发布于 2014-12-27 21:50:10

正是您指定的,您可能不能(可靠地说);浮点值不一定是可表示的。

浮点的内部表示将包含它的所有小数,但在默认情况下,它是用固定数的数字显示的。

你能到达的最近的地方是使用sprintf

代码语言:javascript
复制
$a =  1419714319.05059700;
print "$a\n";
print sprintf("%.8f\n", $a);

威尔输出

代码语言:javascript
复制
1419714319.0506
1419714319.05059695

正如你所看到的,会有一个小错误。当然,另一种可能是分别存储和处理整数部分和十进制部分,可能会将整数部分乘以100万,作为一种缩放:

代码语言:javascript
复制
$not_a_float = implode('.', explode(' 0.', microtime()));

请注意,$not_a_float确实保存了microtime()的“真实”值,但作为字符串保存。一旦您对该值执行任何浮点操作,它将恢复到浮点精度,表示的不精确性将逐渐恢复。

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

代码语言:javascript
复制
((($after[0]-$before[0])+$after[1])-$before[1])

圆括号保证将不准确保持在最小值。即使如此,在计时之后一定要保持所有处理都是可能的,这样它就不会影响计时本身:

代码语言:javascript
复制
$before_raw = microtime();
...
$after_raw = microtime();
$after = explode(' ', $after_raw);
$before = explode(' ', $before_raw);
$diff = ((($after[0]-$before[0])+$after[1])-$before[1]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27671633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档