You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA中返回Single类型的Timer函数为何转为Double后显示12位结果

我在此特别感谢Tim的评论,我之前显然没有使用正确的关键词搜索答案,显得我没有做好充足的自主调研。多亏了Tim,我的问题已经在相关资料及延伸内容中间接得到了解答。我将从非专业人员视角给出概括性解答,希望能对和我知识水平、经验相近的用户有所帮助。

目前已经明确,微软文档中所述Single类型正数最大值为"3.4028235E+38"的表述在数学层面并不准确,根据公开资料说明,其正确值略小于该数值,精确值为3.4028234664E+38。

比该值小1个最低有效位的数值,即3.4028234663E+38,在CPU的运算体系中并不存在,次大值约为3.4028234nnnE+38。像我这样的普通用户在阅读微软文档时,往往不会注意到CPU内部仅存储二进制数值、不存在十进制数值的特性带来的影响,该特性对不同二进制精度等级的数值表示有显著作用。当然大部分普通用户都知道计算机使用0和1存储数据,但我之前没有深入学习过该特性对十进制等效值的影响。我之前误以为单精度浮点类型在十进制下仅能存储7-8位有效数字,该认知并不正确:其可存储更多位数,只是十进制精度约为7-8位有效数字。作为一名将编程作为工具使用了50年的实验物理学家,我本该早就了解该知识点,直到最近这个问题影响到我的项目我才注意到这些细节。

如果我的解答存在重大错误,欢迎各位提出建设性批评意见。


VBA Timer函数返回值精度疑问

微软文档说明VBA的Timer函数返回Single类型,最多支持8位有效数字加指数位,公开资料给出的Single类型正数正确最大值为3.4028234664 × 10^38。

实测直接执行debug.print Timer打印Timer返回值时,仅能看到7位数字,我猜测出现7位而非Single支持的最大8位是测试时间的巧合:测试时当天的秒数最高位大于3,无法达到8位有效数字的最大值。

但如果我将Timer的返回值赋值给Double类型变量再打印,最多可以显示12位数字;甚至我可以先将Timer返回值赋值给Single类型变量(打印显示7位),再将该Single变量转换为Double类型变量,打印后同样得到12位数字。

那么为何返回Single类型的函数会得到Double类型的位数结果?

另外在我的设备上,单次调用Timer耗时约60纳秒,而Timer的更新间隔为几毫秒,因此多次调用Timer大概率会返回相同的值,如本例所示。

测试代码输出

  • Timer Direct Print: 72851.07
  • Timer Direct Print as Double 72851.0703125
  • Timer Single: 72851.07
  • Timer CDbl(Single): 72851.0703125
  • Timer Double:72851.0703125

测试代码

Sub TimerDigits()
Dim sSeconds As Single, dSeconds As Double
sSeconds = Timer
dSeconds = Timer
Debug.Print "Timer Direct Print:"; Timer
Debug.Print "Timer Direct Print as Double"; CDbl(Timer)
Debug.Print "Timer Single:"; sSeconds
Debug.Print "Timer CDbl(Single):"; CDbl(sSeconds)
Debug.Print "Timer Double:"; dSeconds & vbCrLf
End Sub

内容的提问来源于stack exchange,提问作者photonblaster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:48:03