我希望使用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
?
感谢。
答案 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]);