0

我想了解各种数据类型如何控制 microtime() 函数的输出显示方式?

这里有3个场景:

1 . 这将以浮动格式显示 microtime 函数的输出,因为我已将布尔值设置为 true。

我想知道,float 函数默认显示多少位小数(在本例中为 4)?

这与 CPU 的架构有什么关系?

lab$ php -r 'echo microtime(true),"\n";'
1361544317.2586

2 . 在这里,microtime() 函数的输出被强制转换为双精度格式。

那么,这是否意味着它最多只能显示小数点后 6 位微秒?它与浮点数及其最大尺寸/精度有何不同?

lab$ php -r 'echo (double)microtime(),"\n";'
0.751238

3 . 这是 microtime() 函数的默认用法,它打印微秒和 unix 纪元时间戳:

lab$ php -r 'echo microtime(),"\n";' output: 0.27127200 1361544378

我想了解这一点,因为在很多地方我都看到 microtime() 被用来以这种方式为 mt_rand() PRNG 生成种子:

mt_srand((double)microtime() * 1000000)

在这里进行类型转换并乘以 10^6 有什么用?mt_srand() 的参数的最大可能值是多少?

谢谢。

4

1 回答 1

1

浮点数存在一个问题:您可以拥有大数字或高浮点精度。这个问题不适合大量秒(自 1970/1/1 以来的秒数)和高精度 - 微秒的问题。


PHP 尝试通过将时间戳的浮点部分和自纪元以来的整秒数作为字符串中的两个分隔值返回来解决该问题。

对于精度不太重要的情况,PHP 还支持将时间戳作为浮点值返回,四舍五入到最接近的微秒。在我的系统上,准确度是 10.000 秒,如您的示例所示。我不知道这是否被授予。

引用 PHP 手册:

默认情况下,microtime() 以“msec sec”的形式返回一个字符串,其中 sec 是以 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 0:00:00)以来的秒数为单位测量的当前时间,msec 是自 sec 以来经过的微秒数,以秒表示。

如果 get_as_float 设置为 TRUE,则 microtime() 返回一个浮点数,它表示自 Unix 纪元以来的当前时间,以秒为单位,精确到最接近的微秒

这意味着,如果您需要最准确的精度,您应该microtime()在没有参数的情况下使用get_as_float,然后使用字符串和/或 bc_math 操作创建最终时间戳。

于 2013-02-22T15:44:34.410 回答