我希望使用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
谢谢。
发布于 2014-12-27 21:33:29
浮点数中显示的数字数由精密度文件中的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-27 21:37:36
这两样都有,我希望这是你需要的。
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
echo (float)$sec.''.substr((float)$usec, 1);;
}发布于 2014-12-27 21:50:10
正是您指定的,您可能不能(可靠地说);浮点值不一定是可表示的。
浮点的内部表示将包含它的所有小数,但在默认情况下,它是用固定数的数字显示的。
你能到达的最近的地方是使用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()的“真实”值,但作为字符串保存。一旦您对该值执行任何浮点操作,它将恢复到浮点精度,表示的不精确性将逐渐恢复。
您可以分别处理这两个部分;对于时间差,首先计算整数部分之间的差异,然后添加第二个十进制部分,然后减去第一个部分:
((($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]);https://stackoverflow.com/questions/27671633
复制相似问题